一篇文章让你看懂C++构造函数 析构函数

一篇文章让你看懂C++构造函数 析构函数

作用:初始化对象的数据成员

特征

以类名作函数名,无返回类型。

种类

  • 无参数构造函数
A(void) {//无参数构造函数
  m = 0.0;
  n = 0.0;
  std::cout << "调用无参数构造函数\n";
 }

如果程序员没有写无参数构造函数,那么编译器会自动生成一个默认的无参数构造函数,此函数什么都不做。

  • 一般构造函数
A(double _m, double _n) {//一般构造函数(重载构造函数)
  m = _m;
  n = _n;
  std::cout << "调用一般构造函数\n";
 }

基于函数重载原理(参数列表不同,函数名一样都是类名),一般构造函数可以有多个

  • 拷贝构造函数

参数为类对象本身的引用,而且是用一个已存在的类对象拷贝给一个新的该类对象。

A(const A& c) {//拷贝构造函数
  m = c.m;
  n = c.n;
  std::cout << "调用拷贝构造函数\n";
 }

程序员没有写该构造函数时,系统会创建一个默认的拷贝构造函数,但需要注意的是:类中有指针成员时,不建议使用默认的拷贝构造函数。

  • 赋值构造函数:
    类似于拷贝构造函数,区别在于赋值构造函数等号两边的类对象均已创建。
A& operator=(const A& q) {//赋值构造函数(等号运算符重载)
  //先检验等号右边的是否就是等号左边的对象的本身,若是,则直接返回
  if (this == &q) {
   std::cout << "调用赋值构造函数\n";
   return *this;
  }
  //将右边的成员赋值到左边的对象中
  this->m = q.m;
  this->n= q.n;
  std::cout << "调用赋值构造函数\n";
  return *this;
 }
  • 类型转换构造函数:

类型转换构造函数的本质就是一般构造函数:根据一个某一确定类型(double d)创建一个该类(A)对象.

A(double d) {//类型转换构造函数
  m = d;
  n = 0.0;
  std::cout << "调用类型转换构造函数\n";
 }

对于单参数的构造函数,C++会默认定义一个隐式类型转换,自动将该参数类型的值转换为这个类型的值。
可以用explicit禁止隐含类型转换:在编写这个类时在该构造函数名前添加关键字explicit,禁止隐含调用这个构造函数,但还是可以显式调用。

explicit A(double d) {//类型转换构造函数
  m = d;
  n = 0.0;
  std::cout << "调用类型转换构造函数\n";
 }

·委托构造函数:

其本质就是委托其他构造函数帮助自己完成一些任务。

  1. 委托构造函数和其他构造函数一样,只不过委托构造函数的参数列表只可以包含其他一个构造函数
  2. 函数参数列表里不能其他成员变量的初始化
  3. 委托构造函数的参数列表要与包含的构造函数匹配。

date(int x=2020,int y=01,int z=01):year(x),month(y),day(z){ }
date (int *a):date(*a,*(a+1),*(a+2)){ }//委托构造函数

小技巧:
要是想禁止某个构造函数,可以通过delete显式说明:

A(double) = delete;

在这里插入图片描述

析构函数

  • 作用
    销毁一个类对象时,调用析构函数。如果程序员在类定义中没有定义析构函数,那么,编译器会默认生成一个空函数体的析构函数。
  • 特征
  • 析构函数的函数名为类名前加一个符号~,不能有返回类型,不能有任何形参。
~A(){}//析构函数

也可以写成:

~A() = default;//析构函数

析构函数可以保证对象被销毁时,它申请的那块内存能够得到释放,以访造成内存泄漏。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值