码迷,mamicode.com
首页 > 编程语言 > 详细

win编程实践(5)【c++】- 右值引用

时间:2015-12-01 12:57:25      阅读:189      评论:0      收藏:0      [点我收藏+]

标签:

右值引用形式:类型 && a= 被引用的对象。

与左值引用&的区别在于:右值是临时变量, 可理解为右值的引用,右值初始化后临时变量消失。

从实践角度讲,它能够完美解决C++中长久以来为人所诟病的临时对象效率问题。从语言本身讲,它健全了C++中的引用类型在左值右值方面的缺陷。从库设计者的角度讲,它给库设计者又带来了一把利器。从库使用者的角度讲,不动一兵一卒便可以获得“免费的”效率提升…

在标准C++语言中,临时量(术语为右值,因其出现在赋值表达式的右边)可以被传给函数,但只能被接受为const &类型。这样函数便无法区分传给const &的是真实的右值还是常规变量。而且,由于类型为const &,函数也无法改变所传对象的值。C++0x将增加一种名为右值引用的新的引用类型,记作typename &&。这种类型可以被接受为非const值,从而允许改变其值。这种改变将允许某些对象创建转移语义。比如,一个std::vector,就其内部实现而言,是一个C式数组的封装。如果需要创建vector临时量或者从函数中返回vector,那就只能通过创建一个新的vector并拷贝所有存于右值中的数据来存储数据。之后这个临时的vector则会被销毁,同时删除其包含的数据。有了右值引用,一个参数为指向某个vector的右值引用的std::vector的转移构造器就能够简单地将该右值中C式数组的指针复制到新的vector,然后将该右值清空。这里没有数组拷贝,并且销毁被清空的右值也不会销毁保存数据的内存。返回vector的函数现在只需要返回一个std::vector<>&&。如果vector没有转移构造器,那么结果会像以前一样:用std::vector<> &参数调用它的拷贝构造器。如果vector确实具有转移构造器,那么转移构造器就会被调用,从而避免大量的内存分配。


本博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/


右值引用

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//code:http://blog.csdn.net/myhaspl


#include "stdafx.h"
#include <iostream>
using std::endl;
using std::cout;
using std::cin;


class Mypoint{
public:
int n_x = 0;
int n_y = 0;
//code:http://blog.csdn.net/myhaspl
Mypoint(int x, int y) {
n_x = x;
n_y = y;
cout << n_x << "," << n_y;
cout << "  create!" << endl;
}
Mypoint(const Mypoint &myp) {
n_x = myp.n_x;
n_y = myp.n_y;
cout << n_x << "," << n_y;
cout << "  拷贝构造函数调用!" << endl;
}
Mypoint(Mypoint &&myp) {
n_x = myp.n_x;
n_y = myp.n_y;
cout << n_x << "," << n_y;
cout << "  move拷贝构造函数调用!" << endl;
}
~Mypoint() {
cout << n_x << "," << n_y;
cout << "  delete!" << endl;
}
};


int mydistance(const Mypoint &p1, const Mypoint &p2) {
cout << "Mypoint& distance!" << endl;
return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
}






int mydistance(Mypoint &&p1, Mypoint &&p2) {
cout << "Mypoint&& distance!" << endl;
return static_cast<int>(sqrt((p2.n_x - p1.n_x)*(p2.n_x - p1.n_x) + (p2.n_y - p1.n_y)*(p2.n_y - p1.n_y)));
}




int main()
{
int x = 10;
int y = 100;
char temp = ‘ ‘;
int &xleftptr = x;
xleftptr = 20;
cout << xleftptr << endl;




Mypoint myp1= Mypoint(10,20);
Mypoint myp2 = Mypoint(100, 200);
Mypoint myp3 = Mypoint(88, 99);
Mypoint lp3 = myp3;
Mypoint &lp1 = myp1;
Mypoint &lp2 = myp2;
//---左值引用
cout << "左值引用result:" << mydistance(myp1, myp2) << endl;
//---右值引用
cout <<"右值引用result:"  << mydistance(Mypoint(110, 220), Mypoint(1100, 2200)) << endl;
cin >> temp;
return 0;
}




本博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/





20
10,20  create!
100,200  create!
88,99  create!
88,99  拷贝构造函数调用!
Mypoint& distance!
左值引用result:201
1100,2200  create!
110,220  create!
Mypoint&& distance!
右值引用result:2213
110,220  delete!
1100,2200  delete!

本博客所有内容是原创,如果转载请注明来源

http://blog.csdn.net/myhaspl/




win编程实践(5)【c++】- 右值引用

标签:

原文地址:http://blog.csdn.net/myhaspl/article/details/50112877

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!