A f() {At("1234");/创建局部对象t(调用构造函数) return t;/创建返回值对象,用即将消亡的对象t对其 //初始化(调用拷贝构造函数),然后, /对象t消亡(调用析构函数 int main() f(O.g(O;/使用函数f的返回值对象, /然后,该返回值对象消亡(调用析构函数〉 问题:为什么不把对象t申请的空间直接带到返回值对象中呢?
A f() { A t("1234"); //创建局部对象t(调用构造函数) ...... return t; //创建返回值对象,用即将消亡的对象t对其 //初始化(调用拷贝构造函数),然后, //对象t消亡(调用析构函数) } int main() { ...... f().g(); //使用函数f的返回值对象, //然后,该返回值对象消亡(调用析构函数) ...... } 问题:为什么不把对象t申请的空间直接带到返回值对象中呢?
转移构造函数 ▣为了解决上面的问题,C++新国际标准 (C++11)为C++提供了一种新的构造函数 一一转移构造函数(move constructor) ·A(A&&x);/参数类型为右值引用类型:&& 当用一个临时对象或即将消亡的对象去初始化 另一个对象时 如果对象类中有转移构造函数,则会去调用转移构 造函数来对对象初始化。(注意:系统不会提供隐 式转移构造函数!) 否则去调用拷贝构造函数进行对象初始化
转移构造函数 ◼ 为了解决上面的问题,C++新国际标准 (C++11)为C++提供了一种新的构造函数 ――转移构造函数(move constructor): • A(A&& x); //参数类型为右值引用类型:&& ◼ 当用一个临时对象或即将消亡的对象去初始化 另一个对象时, • 如果对象类中有转移构造函数,则会去调用转移构 造函数来对对象初始化。(注意:系统不会提供隐 式转移构造函数!) • 否则去调用拷贝构造函数进行对象初始化