#include <iostream>
#include <utility>
using namespace std;
class A{
private:
int data;//data
int *pi;//point to data
public:
//禁止隐式转换
A(){
data = 0;
pi = &data;
}
~A(){
data = -999999;
pi = nullptr;
}
explicit A(int i) :data(i){
cout << "normal constuctor!" << endl;
pi = &data;
}
A(const A &a){
data = a.data;
cout << "copy constructor!" << endl;
pi = &data;
}
A(A &&a){
cout << "move constructor!" << endl;
//直接移动a.pi到pi
pi = a.pi;
data = a.data; //修改源pi
a.pi = nullptr;
a.data = 0;
}
A operator+(const A &a){
A temp(data + a.data);
cout << endl << "operator+ called!show temp!" << endl;
temp.show();
cout << endl;
return temp;
}
void show()const{
cout << "pi=" << pi << " data=" << data << endl;
}
};
class B
{
private:
A _a;
public:
// B(A aa) :_a(aa){
// }//到这里时, aa 和 _a仍然存在!! aa浪费了, 白死了!
//************************ 最高效 ***********************************
B(const A& aa) :_a(aa){
}//利用main中的a复制构造_a, 毫无浪费
//********************* 最高效 *****************************
// B(A aa){
// _a = std::move(aa);//_a白白构造了一遍!
// }
~B(){}
};
//vs可以像Eclipse一样按Tab键!!!!!!!
int main()
{
int i = 99;
A a(10);
B b(a);//复制构造a
}
我本来猜想会有move constructor的编译器优化, 不过const &也可以避免多余的构造函数调用, 我想多了