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

Posted COCO_PEAK_NOODLE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;

)

以上是关于C++之构造函数缺省构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++:调用无参数的构造函数为啥不加括号

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

为什么 没有缺省构造函数的类类型成员 必需要在初始化列表 里初始化 ?

C++学习摘要之二:构造函数和析构函数

c++的复制构造函数

C++类和对象之对象的初始化和清理