zoukankan      html  css  js  c++  java
  • Cpp拷贝构造函数发生的时刻(还存在疑问)

    如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数

    class numbered{
    public :
        numbered(){//构造函数
            mysn = 0;
        }
        numbered(const numbered& inputOne){//拷贝构造函数
            mysn = inputOne.mysn;
            mysn = mysn +1;
        }int mysn;
    };

    拷贝构造函数发生以下情况:

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    class numbered{
    public :
        numbered(){//构造函数
            mysn = 0;
        }
        numbered(const numbered& inputOne){//拷贝构造函数
            mysn = inputOne.mysn;
            mysn = mysn +1;
        }int mysn;
    };
    
    void f(numbered s){
        cout<<s.mysn<<endl;
    }
    
    int main()
    {
        numbered a;//构造函数
        numbered b=a;//【1】拷贝构造函数
        f(a);//【2】将a赋给函数f过程中,发生了拷贝构造
        //【3】从一个返回类型为非引用的函数返回一个对象--类似第二点
    
        //【4】用花括号列表(C++11)初始化一个数组中的对象或一个聚合类中的成员
    
        system("pause");
        return 0;
    }

    运行结果:

    从watch窗口可以看到:b.mysn比a.mysn多1,这是由于拷贝构造函数造成的

    从输出中可以看出,f(a)输出了1,这也是由于拷贝构造函数造成的。

    关于拷贝构造函数发生的四种情况:

        numbered b=a;//【1】拷贝构造函数
        f(a);//【2】将a赋给函数f过程中,发生了拷贝构造
        //【3】从一个返回类型为非引用的函数返回一个对象--类似第二点
        //【4】用花括号列表(C++11)初始化一个数组中的对象或一个聚合类中的成员

    第二点,第三点最容易忽略,应该注意。



    以上是拷贝构造函数的基本内容,下面用一个比较复杂的例子来分析拷贝构造函数,构造函数等的区别
    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    class A
    {
    public:
        A(){
            cout << "constructor called!" << endl;
        }
        A(int i) : x(i){
            cout << i << " constructor called!" << endl;
        }
        A(const A &a){
            x = a.x+1;
            cout << x << " copy constructor called!" << endl;
        }
        A &operator=(const A &a){
            x = a.x+10;
            cout << x << " 拷贝赋值函数called!" << endl;
            return *this;
        }
        ~A(){cout << x << " destructor called" << endl;}
    private:
        //A(const A &a){cout << "copy constuctor called!" << endl;}
        int x;
    };
    
    A get_A()
    {
        A a(5);
        return a;
    }
    
    int main()
    {
        cout<<"-----1-----"<<endl;
        A a = 1;   // 1  
        cout<<endl;
    
        cout<<"-----2-----"<<endl;
        A b = get_A(); // 2
        cout<<endl;
    
        cout<<"-----3-----"<<endl;
        b = a;   // 3
        cout<<endl;
    
        cout<<"-----4-----"<<endl;
        A c = A(2); // 4
        cout<<endl;
    
        cout<<"-----5-----"<<endl;
        b = 3;   // 5
        cout<<endl;
    
        cout<<"-----6-----"<<endl;
        A d = b;     // 6
        cout<<endl;
    
        cout<<"-----7-----"<<endl;
        A e(b);     // 7
        cout<<endl;
        return 0;
    }

    运行结果

    关于第1点和第4点,为何没有拷贝构造函数这个操作??

    这个地方不是很明白?

    也请高手指教。我如果搞清楚了,也会及时更新

  • 相关阅读:
    vue模拟接口数据
    修改placeholder的颜色
    network is unreachable mongodb
    数字转时间
    前端下载流文件
    jquery的AJAX中各个事件执行顺序
    移动端谨慎使用overflow:hidden
    时间函数整理
    background-size使用时的注意点
    关于iframe
  • 原文地址:https://www.cnblogs.com/wuqi/p/4658831.html
Copyright © 2011-2022 走看看