首页 > 代码库 > C++ constructor 初始化对象成员最高效的做法

C++ constructor 初始化对象成员最高效的做法

#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=http://www.mamicode.com/" << 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 &也可以避免多余的构造函数调用, 我想多了 

C++ constructor 初始化对象成员最高效的做法