构造函数的使用位置与特点

构造了9个例子,基本应该覆盖了所有情况,其中编译器如何进行优化的,也做了部分探索。

普通构造函数

造出来什么样就什么样。

拷贝构造函数

1.用同类初始化。
2.传入参数。
3.返回参数。

优化特征 NRV(在测试点9中,返回的参数==传入的参数,所以同时存在 2、 3,两次拷贝构造函数的调用)

返回的参数!=传入的参数-->不调用拷贝构造函数(利用内部的普通构造函数的值即可)

赋值构造函数

已经存在的类,用另一个类进行处理。
PS:说是赋值构造函数,实际上就是clone函数。所以在传参的时候

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

// 拷贝构造函数
// 赋值构造函数
// 构造函数
// 析构函数
class Solution{
public:
    Solution(){
        cout << "默认构造函数" << endl;
    }
    Solution(const Solution &rhs){
        data = rhs.data;
        cout << "拷贝构造函数" << endl;
    }
    Solution& operator=(const Solution &rhs){
        data = rhs.data;
        cout << "赋值构造函数" << endl;
        return *this;
    }
    ~Solution(){
        // cout << data << endl;
        cout << "析构函数" << endl;
    }
public:
    string data;
};

// 用于测试传入参数
void my_func1(Solution temp){
    ;
}

// 用于测试返回值
Solution my_func2(){
    Solution other;
    other.data = "func2";
    return other;
}

Solution my_func3(Solution &s){
    return s;
}

Solution my_func4(Solution s){
    return s;
}

int main()
{
    cout << "测试1:默认构造函数" << endl;
    Solution a;
    cout << "测试2:拷贝构造函数测试点1,显式初始化" << endl;
    Solution b(a);
    cout << "无用测试:默认构造函数" << endl;
    Solution c;
    cout << "测试3:赋值构造函数" << endl;
    c = b;
    c.data = "原来的c";

    cout << "测试4:拷贝构造函数测试点2,函数传入参数" << endl;
    my_func1(c);
    cout << "测试5:拷贝构造函数测试点3,返回值。" << endl;
    my_func2();
    cout << "测试6:拷贝构造函数测试点4,返回值,返回到一个未初始化的值。(结果是赋值构造函数)" << endl;
    Solution d = my_func2();
    cout << "测试7:拷贝构造函数测试点5,返回值,返回到一个已初始化的值,增加一个赋值构造函数" << endl;
    c = my_func2();
    cout << "测试8:传入引用,返回(以引用为结果的非引用)。调用拷贝构造函数。" << endl;
    my_func3(c);
    cout << "测试9:传入正常,返回正常。调用拷贝构造函数(两次)(传入一次、传出一次)。" << endl;
    my_func4(c);
    cout << "结束" << endl;
    return 0;
}
测试结果

你可能感兴趣的:(构造函数的使用位置与特点)