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);
}
最近在学习右值引用:
{
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;
}