关于右值引用的问题

C++语言 码拜 8年前 (2016-09-25) 953次浏览
class RValueTest
{
public:
RValueTest(int&& r_value)
{
cout << “RValue Constructor” << r_value << endl;
}
RValueTest(int& l_value)
{
cout << “LValue Constructor” << endl;
}
};
class RValueTest1
{
public:
RValueTest1(int&& r_value)
{
int&& jjj = std::move(r_value);
RValueTest a1(jjj);
}
RValueTest1(int& l_value)
{
cout << “LValue Constructor” << endl;
}
};
int main()
{
RValueTest1 a1(5);
}
最近在学习右值引用:

那本人在什么场合适合右值引用呢?
既然左值引用已经算是地址级别了,右值引用还能优化多少?

右值引用本身不具有优化效果,它的作用是让你能通过区分左值和右值编写不同的代码来进行优化。
一个典型的应用就是移动构造函数(通过右值引用来识别右值参数,然后就可以放心大胆地转移(而非拷贝)资源了)。

15

这份代码你看看吧,本人已经写的够详细的了。

void clearStack() {
	char ch[100] = { 0 };
}
class OBJ {
public:
	int i;
	OBJ() { printf("create construction\n"); }
	/*此处的copy和move构造函数,
	只为直观观看调用,并没有实现,
	通过这两个函数生成的对象会造成成员数据i丢失,
	所以下面那两个i!=10
	如此处不显示声明构造函数,编译器会帮你自动生成并实现。
	*/
	OBJ(const OBJ& other) { printf("copy construction\n"); }
	OBJ(OBJ&& other) { printf("move construction\n"); }
};
OBJ testMv() {
	OBJ o;
	o.i = 10;
	printf("testMv::o=%p, o.i=%d\n",&o,o.i);
	return o;
}
OBJ& testMv1() {
	OBJ o;
	o.i = 10;
	printf("testMv1::o=%p, o.i=%d\n", &o, o.i);
	return o;
}
class OBJ1 {
public:
	OBJ o;
	OBJ testMv() {
		o.i = 10;
		printf("testMv::o=%p, o.i=%d\n", &o, o.i);
		return o;
	}
	OBJ& testMv1() {
		o.i = 10;
		printf("testMv1::o=%p, o.i=%d\n", &o, o.i);
		return o;
	}
};
int main()
{
	OBJ1 obj1;
	printf("~~~~~~~~~~~~~~~~construction OBJ1 over~~~~~~~~~~~~~~~~~~~~~~~\n\n");
	printf("~~~~~~~~~~~~~~~~start func~~~~~~~~~~~~~~~~~~~~~~~\n");
	OBJ obj = testMv();
	printf("main::obj=%p,obj.i=%d\n", &obj,obj.i);
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	OBJ& objRef = testMv1();
	/*objRef的实际对象栈已经销毁,之所以objRef.i依旧会是10,
	建议学习一点汇编的基本概念,然后使用VS的反汇编,一目了然。
	简单来说,就是上次调用的栈上的数据还在那里没人管,造成的数据遗留
	clearStack()取消注释并运行
	objRef.i = 0;
	*/
	clearStack();
	printf("main::objRef=%p,objRef.i=%d\n", &objRef, objRef.i);
	printf("\n\n\n");
	printf("~~~~~~~~~~~~~~~~start obj::func~~~~~~~~~~~~~~~~~~~~~~~\n");
	OBJ objMember = obj1.testMv();
	printf("main::objMember=%p,objMember.i=%d\n", &objMember, objMember.i);
	printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	OBJ& objMemberRef = obj1.testMv1();
	printf("main::objMemberRef=%p,objMemberRef.i=%d\n", &objMemberRef, objMemberRef.i);
    return 0;
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于右值引用的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)