C++之构造函数、缺省构造函数

在这里插入图片描述

1、构造函数

1.1 特征:

  • 名称与类名相同
  • 无返回值
  • 可以包含多个版本(重载)

1.2 (C++11)代理构造函数

class Str{
  //这个就是代理构造函数,在执行时,先执行Str(3),再执行Str()
  //即先打印2,再打印1
  Str():Str(3{
    std::cout <<  "1" << std::endl;
  }

  Str(int value){
    std::cout <<  "2" << std::endl;
    x = value;
}

private:
   int x;
}

2-初始化列表,是用来初始化对象的(不是赋值的),划重点(因为C++是考虑性能的一门语言,所以初始化和赋值是2个概念)

为什么有初始化的概念?是为了提升软件速度。初始化可以为变量赋初始值,赋值是把一个变量拷贝给另一个变量,所以赋值不涉及内存的分配。所以如果先初始化,再赋值的效率 < 直接初始化赋值的效率。
所以在构造函数时最好使用初始化列表,什么是初始化列表呢?如下

class Str()
{
   Str(int value, std::string a)
   //这个就是初始化列表
   :x(value)
   ,y(a)
   {
      //这个是赋值
      x = value;
   }

private:
int x;
std::string y;

}

要注意的地方:

  • 一些情况下必须使用初始化列表(如类中包含引用成员)
class Str()
{
 Str(int& value){
  //引用初始化,注意传参要加&,不然引用的是形参的对象,形参销毁会有问题?
  :x(value)
}

private:
int& x;
}

  • 注意元素的初始化顺序与其声明顺序相关,与初始化列表中的顺序无关,
    为什么?因为初始化列表中的顺序有多种,但是程序销毁时是有顺序的(即后构造,先销毁),所以也必须要规定程序的初始化顺序,所以要按照声明的顺序进行初始化。

  • 使用初始化列表覆盖类内成员初始化的行为
    什么意思?两个概念,一个是初始化列表,一个是类内成员初始化
    如下:

class Str{

Str(int value, std::string name)
//初始化列表
: x(value)
, y(name)
{

}

private:
  //类内成员初始化
  int x = 3;
  string y = "a";

}


int main()、
{
   Str m(4,"b");

   //实际m内部的x=4 y = "b",这是因为初始化列表在内成员初始化之后执行。

}
3、缺省构造函数:不需要提供实际参数就可以调用的构造函数,这里注意一点,一但提供了有参的构造函数,缺省构造函数就失效了(因为系统此时认为,默认的构造函数可能会带来未知的安全隐患,所以就失效了)
class Str()
{
  //这个就是缺省构造函数
  Str()
  {
  }
  //这个也是缺省构造函数,因为3是默认的
  Str(int value = 3){
  
  }

}
  • 合成的缺省构造函数会使用缺省初始化来初始化数据成员,
    即缺省的构造函数在初始化数据成员时,每个成员会再次调用自己的缺省构造函数,如果没有,就会报错。
  • 调用缺省构造函数时避免most vexing parse

意思是:

class Str{
  
private:

int x;
}

int main()
{
  Str m; //right
  //这里程序会认为下面是一个返回类型为Str的函数
  Str m(); //wrong 
  //所以
  Str m{}; //right
}

可以使用default关键字定义缺省构造函数

class Str(
   Str() = default;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

可峰科技

生活不易

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

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

打赏作者

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

抵扣说明:

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

余额充值