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; }