c++复制构造函数和析构函数

复制构造函数

定义:用已有的对象初始化新的对象

实现:已经有的对象用他的引用作为构造函数的参数

若不定义复制构造函数,编译器也会自动为我们生成默认的复制构造函数,此函数实现两个对象的数据成员的一一对应,所以有时候我们都不写,直接用系统构造这个,而有时则不想这样一一复制
可用=delete指示编译器不生成默认复制构造函数

复制构造函数的形参是本类对象的引用,且引用前要加const,因为用引用作为参数时双向传递,避免实参被修改。加const保证只是读取引用中的定义

public:point(int xx = 0, int yy = 0) {  x = xx;  y = yy; }//构造函数,内联
      point(const point& p) ;

复制构造函数示例完整代码如下:

#include<iostream>
using namespace std;
class point
{
public:point(int xx = 0, int yy = 0) {  x = xx;  y = yy; }//构造函数,内联
      point(const point& p);
      int getX() { return x; }
      int getY() { return y; }   
private: int x, y;
};


point::point(const point& p)
{
    x = p.x;//这里的p由于是引用,所以p其实就是一个对象,是拿来初始化别人的对象,例如下面的a
    y = p.y;//左边的x,和y是被初始化的那个类的x和y
    cout << "正在复制构造函数" << endl;

}//用const就是怕在这里修改了p。从而把p绑定的对象也修改了,例如a


void fun1(point p)
{
    cout << p.getX() << endl;

}


point fun2()
{
    point a(1,2);
    return a;//返回时返回类型是类,要用复制构造函数
}

int main()
{
    point a;//这个a没有被手动赋值,则用构造函数中的形参值,0 ,0;
    point b(a);//a根据构造函数把x 和y的值复制给类b
    cout<<b.getX() << endl;//输出b的X
    fun1(b);//调用类,实参赋值给形参,也要调用函数
    b = fun2();
    cout << b.getX() << endl;
    return 0;
}
                       代码中用到复制构造函数的地方
 point b(a);//类对象拷贝时
fun1(b);//调用类,实参赋值给形参,也要调用函数
point fun2()
{
    point a(1,2);
    return a;//返回时返回类型是类,要用复制构造函数
}

                          如果复制构造函数写成这样

point::point(const point& p)
{
    x = p.x;
    cout << "正在复制构造函数" << endl;//这里只是检验复制了构造函数

那么b的y值是不定的,因为b的y值没有被初始化
point b(a)
这里由于定义后的括号有形参,所以不用第一个构造函数,而是用第二个构造函数,也就是复制构造函数,所以y是没有被赋值为0的。

析构函数

作用:完成对象被删除之前的一些善后工作
在对象生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间

如果程序未声明,则编译器会自动生成的相当于自己这样定义的:

~point();//类内这样定义
point::~point()
{}//类外这样定义
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值