美文网首页
构造函数的使用位置与特点

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

作者: 淇漯草 | 来源:发表于2020-09-13 16:10 被阅读0次

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

    普通构造函数

    造出来什么样就什么样。

    拷贝构造函数

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

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

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

    赋值构造函数

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

    #include <iostream>
    #include <cmath>
    #include <vector>
    #include <algorithm>
    #include <map>
    #include <stack>
    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;
    }
    
    测试结果

    相关文章

      网友评论

          本文标题:构造函数的使用位置与特点

          本文链接:https://www.haomeiwen.com/subject/mxanektx.html