C++类的构造函数/析构函数

构造函数

1.构造函数

a.作用

构造函数的作用是在对象被创建时使用特定的值构造对象,将对象初始化为一个特定的初始状态。

b.特点

①.构造函数的函数名与类名相同;
②.构造函数没有类型,也没有返回值;
③.构造函数可以重构,即可以根据实际情况自定义构造函数。

c.编程实例

以下代码为CPoint类的自定义含参的构造函数及其实现:

#include<iostream>
using namespace std;
class CPoint
{
public:
    CPoint(int xx,int yy);//构造函数
    int getX(){return x;}//成员函数
    int getY(){return y;}
private:
    int x,y;
};
CPoint::CPoint(int xx,int yy)//构造函数的实现
{
    x = xx;
    y = yy;
    cout<<"我是构造函数!"<<endl;
}
int main()
{
    CPoint p1(1,2);
    cout<<p1.getX()<<" "<<p1.getY()<<endl;
    return 0;
}

运行结果为:
在这里插入图片描述

2.默认构造函数

a.默认构造函数的三种情况

①.不定义构造函数时,编译器自动产生的默认构造函数;
②.在类中自定义无参数的构造函数也是默认构造函数;
③.全部参数都有默认形参值的构造函数也是默认构造函数。

b.编程实例

以下代码为CPoint类的不含参的构造函数及其实现:

#include<iostream>
using namespace std;
class CPoint
{
public:
    CPoint();//默认构造函数
    int getX(){return x;}//成员函数
    int getY(){return y;}
private:
    int x,y;
};
CPoint::CPoint()//默认构造函数的实现
{
    x = 0;
    y = 0;
    cout<<"我是默认构造函数!"<<endl;
}
int main()
{
    CPoint p2;
    cout<<p2.getX()<<" "<<p2.getY()<<endl;
    return 0;
}

运行结果为:
在这里插入图片描述

3.复制构造函数

a.复制构造函数被调用的两种情况

①.定义一个对象时,以本类另一个对象作为初始值,发生复制构造;
②.如果函数的形参是类的对象,调用函数时,将使用实参对象初始化形参对象,发生复制构造;
③.如果函数的返回值是类的对象,函数执行完成返回主调函数时,将使用return语句中的对象初始化一个临时无名对象,传递给主调函数,发生复制构造。

b.编程实例

以下代码为CPoint类的复制构造函数及其以上三种被调用情况的实现:

#include<iostream>
using namespace std;
class CPoint
{
public:
    CPoint(int xx = 0,int yy = 0){x = xx;y = yy;}//内联构造函数
    CPoint(const CPoint &p);//复制构造函数
    int getX(){return x;}//成员函数
    int getY(){return y;}
private:
    int x,y;
};
CPoint::CPoint(const CPoint &p)//复制构造函数的实现
{
    x = p.x;
    y = p.y;
    cout<<"我是复制构造函数!"<<endl;
}
void fun_1(CPoint p)//对象p也调用复制构造函数
{
    cout<<p.getX()<<" "<<p.getY()<<endl;
}
CPoint fun_2()//返回值为CPoint类对象的函数
{
    CPoint p(1,2);
    return p;
}
int main()
{
    CPoint p1(4,5);//p1对象的定义以及初始化
    CPoint p2 = p1;//情况1,用p1初始化p2,第一次调用复制构造函数
    cout<<p2.getX()<<" "<<p2.getY()<<endl;
    fun_1(p2);//情况2,对象p2作为fun_1的实参,第二次调用复制构造函数
    p2 = fun_2();//情况3,函数的返回值是类对象,函数返回时调用复制构造函数
    cout<<p2.getX()<<" "<<p2.getY()<<endl;
    return 0;
}

运行结果为:
在这里插入图片描述
【注意】情况3这里表面上还是构造了一个临时对象,但是编译器通常会进行优化,使之不产生临时对象。解决了显式构造临时对象返回的问题。

析构函数

作用

完成对象被删除前的一切清理工作。
同样,如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。

编程实例

以下代码为CPoint类的析构函数及其实现:

#include<iostream>
using namespace std;
class CPoint
{
public:
    CPoint(int xx = 0,int yy = 0){x = xx;y = yy;}//内联构造函数
    ~CPoint();//析构函数
private:
    int x,y;
};
CPoint::~CPoint()//析构函数的实现
{
    cout<<"我是析构函数!"<<endl;
}
int main()
{
    CPoint p1(4,5);//p1对象的定义以及初始化
    return 0;
}

运行结果为:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芷汀若静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值