一些基础知识

#include<iostream>
using namespace std;

class Test{
public:
    //Test t;
    Test(int d = 0):data(d){
        cout<<"Create Test Object:"<<this<<endl;
    }
    //Test t1(t),不写也没事,系统有默认的拷贝构造函数
    Test(const Test &t){  //引用
        cout<<"Copy Create Test Object:"<<this<<endl;
        data = t.data;
    }
    /*
    //系统默认的拷贝构造函数
    Test(const Test &t){  //引用
        data = t.data;  //所有数据都会初始化
    }
    */
    //~t
    ~Test(){
        cout<<"Free Test Object:"<<this<<endl;
    }
private:
    int data;
};

void main(){
    Test t(10);

    Test t1(t);

    Test t2 = t1;  //初始化:调用的是拷贝构造函数,而不是赋值(=左边的t2不存在,所以是初始化)

    Test t3;
    t3 = t2;  //赋值:调用的是赋值语句(=左边的t3存在,所以是赋值)
}

什么时候会调用拷贝构造函数?

1.初始化。

2.函数里的参数是对象的时候,也会调用拷贝构造函数。追根究底还是拿对象对对象进行初始化。

void fun(Test x){
    int value;
    value = x.GetData();
}

void main(){
    Test t1(10);
    Test t2(t1);

    fun(t2);  //会调用一次拷贝构造函数
}

3.当函数返回值是对象。

void fun(Test x){
    int value;
    value = x.GetData();
    Test tmp(value);
    return tmp;  //tmp不能返回,要产生一个临时对象,又变成对象对对象初始化,调用拷贝构造函数
}

void main(){
    Test t1(10);
    Test t2(t1);

    fun(t2);  //会调用一次拷贝构造函数
}
int getdata(int x,int y){
    int sum = x + y;
    return sum;  //sum是不能返回的,因为它只存在于这个函数里面,其实是借助一个中间的临时变量返回值,然后再析构掉
}

int value = getdata(1,2);

版权声明:本文为博主原创文章,如有错误,恳请大家在评论区指出,在下不胜感激~如要转载注明出处即可~