成员函数 | 类 C 的典型形式: |
---|---|
默认构造函数 | C::C(); |
析构函数 | C::~C(); |
拷贝构造函数 | C::C (const C&); |
拷贝赋值 | C& operator= (const C&); |
移动构造函数 | C::C (C&&); |
移动赋值 | C& operator= (C&&); |
|
|
Example
有一个默认构造函数。因此,可以通过简单地声明它们而不带任何参数来构造该类的对象:
|
|
|
|
int
类型参数的构造函数。因此,下面的对象声明是正确的:
|
|
|
|
|
|
bar's content: Example |
Example3
有一个被定义为空代码块的默认构造函数(即一个无参数的构造函数):
|
|
Example3
的对象可以无参数地构造(如此例中声明的 foo
)。通常情况下,对于所有没有其他构造函数的类,这样的默认构造函数会被隐式定义,因此不需要显式定义。但在本例中,Example3
有另一个构造函数:
|
|
void
都不返回。它也使用类名作为自己的名字,但前面加上一个波浪号(~
)。
|
|
bar's content: Example |
Example4
为一个 string
分配存储空间。该存储空间稍后由析构函数释放。foo
和 bar
,这发生在 main
函数的末尾。const
限定的),并且可以用这种类型的单个参数来调用。例如,对于一个类 MyClass
,拷贝构造函数可能具有以下签名:
|
|
|
|
|
|
Example4
这样的类,这可能不是我们所期望的,因为它包含了它自己管理存储的指针。对于那个类,执行浅拷贝意味着指针的值被拷贝了,但内容本身没有;这意味着两个对象(副本和原始对象)将共享同一个 string
对象(它们都将指向同一个对象),并且在某个时刻(在析构时)两个对象都将尝试删除同一块内存,这很可能导致程序在运行时崩溃。这可以通过定义一个执行深拷贝的自定义拷贝构造函数来解决:
|
|
bar's content: Example |
|
|
baz
是在构造时使用等号初始化的,但这并不是一个赋值操作!(尽管它可能看起来像):对象的声明不是赋值操作,它只是调用单参数构造函数的另一种语法。foo
的赋值是一个赋值操作。这里没有声明任何对象,而是在一个已存在的对象 foo
上执行一个操作。operator=
的一个重载,它接受类本身的值或引用作为参数。返回值通常是对 *this
的引用(尽管这不是必需的)。例如,对于一个类 MyClass
,拷贝赋值运算符可能具有以下签名:
|
|
Example5
。在这种情况下,该类不仅面临着两次删除所指向对象的风险,而且赋值操作还会因未在赋值前删除对象所指向的对象而造成内存泄漏。这些问题可以通过一个拷贝赋值运算符来解决,它会删除旧的对象并执行深拷贝:
|
|
string
成员不是常量,它可以重用同一个 string
对象:
|
|
|
|
fn
返回的值和用 MyClass
构造的值都是未命名的临时对象。在这些情况下,没有必要进行拷贝,因为未命名对象的生命周期非常短,当这是一个更高效的操作时,它的资源可以被另一个对象获取。
|
|
&&
)来指定。作为参数,一个右值引用匹配该类型的临时对象参数。
|
|
foo's content: Example |
成员函数 | 隐式定义 | 默认定义 |
---|---|---|
默认构造函数 | 如果没有其他构造函数 | 什么都不做 |
析构函数 | 如果没有析构函数 | 什么都不做 |
拷贝构造函数 | 如果没有移动构造函数和移动赋值运算符 | 拷贝所有成员 |
拷贝赋值 | 如果没有移动构造函数和移动赋值运算符 | 拷贝所有成员 |
移动构造函数 | 如果没有析构函数、拷贝构造函数、拷贝或移动赋值运算符 | 移动所有成员 |
移动赋值 | 如果没有析构函数、拷贝构造函数、拷贝或移动赋值运算符 | 移动所有成员 |
default
和 delete
来显式选择这些成员中的哪些存在其默认定义,或者哪些被删除。语法是以下之一:function_declaration = default; function_declaration = delete; |
|
|
bar's area: 200 |
Rectangle
可以用两个 int
参数构造,也可以被默认构造(无参数)。然而,它不能从另一个 Rectangle
对象进行拷贝构造,因为这个函数已经被删除了。因此,假设有上一个例子中的对象,下面的语句将是无效的:
|
|
|
|
|
|
default
并不定义一个与默认构造函数(即无参数构造函数)相等的成员函数,而是定义一个与(如果未被删除)本应被隐式定义的构造函数相等的函数。delete
或 default
。![]() 类 (II) | ![]() 目录 | ![]() 友元和继承 |