C++构造函数

78 阅读3分钟

一、构造函数分类

  • 默认构造函数 (Default Constructor):没有任何参数的构造函数,或者所有参数都有默认值的构造函数

  • 拷贝构造函数 (Copy Constructor)当使用一个已有对象来初始化一个新对象时,会调用拷贝构造函数。拷贝构造函数的参数是一个常量引用,表示将要被拷贝的对象。拷贝构造函数的作用是创建一个新的对象,并将原对象的值复制到新对象中。通常情况下,用户自定义拷贝构造函数时会实现对指针的深拷贝操作,以确保新对象和原对象不共享同一块内存。C++默认拷贝构造函数执行的是浅拷贝操作

  • 移动构造函数 (Move Constructor):在C++11标准中引入了移动语义,移动构造函数用于支持移动语义。当一个对象需要被移动而不是被拷贝时,会调用移动构造函数。移动构造函数的参数是一个右值引用,表示将要被移动的对象。移动构造函数的作用是将原对象的内部资源直接转移到新对象中,而不是像拷贝构造函数一样复制一份。这样可以避免不必要的内存分配和数据复制,提高程序的效率。

二、 C++11中关于特殊成员函数自动生成规则:

1. 默认构造函数:

  • 仅在类没有显式声明任何构造函数(不论是定义还是删除)时,编译器才会生成默认构造函数。

2. 拷贝构造函数:

  • 如果没有显式声明拷贝构造函数,并且类的移动构造函数和移动赋值运算符都没有被显式声明(不论是定义还是删除),那么编译器会生成默认的拷贝构造函数。
  • 如果类有显式声明的移动构造函数或移动赋值运算符,编译器不会为你生成拷贝构造函数,除非你显式要求它这样做。如果你没做要求,它将被标记为删除。

3. 拷贝赋值运算符:

  • 与拷贝构造函数的规则类似。如果没有显式声明,并且没有显式声明移动构造函数或移动赋值运算符,编译器会为你生成默认的拷贝赋值运算符。

4.移动构造函数和移动赋值运算符:

如果一个类没有显式地声明移动构造函数和移动赋值运算符,编译器会在某些条件下自动生成它们。这些条件包括:

  • 类没有显式地声明任何拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符或析构函数。
  • 类的所有成员都可以被移动构造或移动赋值。

5.析构函数:

  • 显式声明析构函数不会阻止编译器生成拷贝构造函数或拷贝赋值运算符。但是,显式声明析构函数会阻止编译器生成移动构造函数和移动赋值运算符,除非你显式地请求它们。
  • 显式地delete析构函数,编译器无法销毁对象。