65,187
社区成员




MyString::MyString(MyString&& str)
{
cout << "右值应用在构造函数的使用-----: " << str.m_data <<endl;
m_data = str.m_data;
m_len = str.m_len;
str.m_data = NULL;
str.m_len = 0;
}
MyString& MyString::operator=(MyString&& str)
{
cout << "右值引用在赋值函数中的使用-----: " << str.m_data << endl;
if (this != &str)
{
m_data = str.m_data;
m_len = str.m_len;
str.m_data = NULL;
str.m_len = 0;
}
return *this;
}
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;
}
#include <iostream>
using namespace std;
class RValueTest
{
public:
RValueTest(int&& r_value)
{
cout << "r_value:" << r_value << endl;
r_value = 1;
}
RValueTest(int& l_value)
{
cout << "l_value:" << l_value << endl;
l_value = 2;
}
};
int main()
{
int a = 0;
RValueTest a1(std::move(a));
cout << "main_a :"<< a << endl;
RValueTest a2(a);
cout << "main_a :"<< a << endl;
}