C++之构造函数,拷贝构造,析构函数再剖析

来源:互联网 发布:小乖淘宝店鞋店 编辑:程序博客网 时间:2024/05/29 17:22

我们已经了解了构造函数,析构函数基本用法,创建一个对象,我们可以调用构造函数进行初始化,要是我们用已知的对象去创建另一个对象呢?
例如:

Tpoint d1(3,5);Tpoint d2(d1);//考虑考虑

由一个对象初始化另一个对象,系统会调用拷贝构造函数或者默认拷贝构造函数
拷贝构造函数
1:名字与类同名,并且不被指定返回类型
2:只有一个参数,并且为类对象的引用
3:格式

<类名> :: <拷贝构造函数名><类名>& <引用名>){    }拷贝构造函数名与类同名<类名> :: <拷贝构造函数名><类名> <引用名>)//无引用时传值会创建                                      //临时对象,临时对象会调 用拷贝构造函数形成无穷递归{    }拷贝构造函数名与类同名

从下面代码分析:

class  Tpoint{public :     Tpoint(int x, int y);//自定义的构造     Tpoint(const Tpoint& p);//拷贝构造类内声明     Tpoint()     {         cout << "默认构造" << endl;     }    /*void SetPoint(int x,int y);*/    int Xcoord()    {        return X;    }    int Ycoord()    {        return Y;    }     ~Tpoint()//析构函数    {        cout << X <<"   "<< Y << " 析构 " << endl;    }private:    int X;    int Y;}; Tpoint:: Tpoint(int x, int y){    X = x;    Y = y;    cout << "自定义构造" << endl;}Tpoint::Tpoint(const Tpoint& p)//拷贝构造函数{    X = p.X;    Y = p.Y;    cout << "Copy_构造" << endl;}Tpoint fun(Tpoint w);Tpoint fun(Tpoint w)//对象作为函数形参  (实参初始化形参调用拷贝构造函数赋初值){    cout << "shican" << endl;    int x;    int y;    x = w.Xcoord() + 10;    y = w.Ycoord() + 20;    Tpoint R(x, y);//调用自定义构造函数创建临时对象    return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)             //在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,}int main(){    Tpoint d1(12,20), d2(0,0), d3(3,3);    Tpoint d4(2, 3);    Tpoint d5(d4);    Tpoint P = fun(d5);    d2 = d3;     cout << d5.Xcoord() << " " << d5.Ycoord() << endl;    cout << P.Xcoord() <<" "<< P.Ycoord() << endl;    cout << d2.Xcoord() <<" "<< d2.Ycoord() << endl;}

这里写图片描述
从程序运行结果来看,

Tpoint d5(d4);//一个对象初始化另一个对象,系统会调用拷贝构造函数Tpoint P = fun(d5);Tpoint fun(Tpoint w)//对象作为函数形参  (实参d5初始化形参w调用拷贝构造函数赋初值){    cout << "shican" << endl;    int x;    int y;    x = w.Xcoord() + 10;    y = w.Ycoord() + 20;    Tpoint R(x, y);//调用自定义构造函数    return R;//调用拷贝构造函数创建临时对象来保存R数据,该对象是无名的,(匿名对象)             //在执行完 Tpoint P = fun(d5)时,内容已经赋值给P,然后临时对象被释放,}

临时对象所起的作用详情:
这里写图片描述

void fun( const Tpoint w)//调用类的拷贝构造函数进行值传递void fun( const Tpoint& w) //不会调用拷贝构造函数Tpoint fun( const Tpoint& w)//传参时不会调用{      .......      return d;//返回时会调用拷贝构造函数生成临时对象}Tpoint& fun( const Tpoint& w)//不会调用拷贝构造函数
0 0