C++官方参考链接:Special members - C++ Tutorials (cplusplus.com)
特殊成员
[注意:本章要求正确理解动态分配内存( dynamically allocated memory)]
特殊成员函数是在某些情况下隐式定义为类成员的成员函数。有六个:
| Member function(成员函数) | typical form for class C:(类C的典型形式) |
|---|---|
| Default constructor | C::C(); |
| Destructor | C::~C(); |
| Copy constructor | C::C (const C&); |
| Copy assignment | C& operator= (const C&); |
| Move constructor | C::C (C&&); |
| Move assignment | C& operator= (C&&); |
让我们逐一分析一下:
默认构造函数
默认构造函数是在声明类的对象但不使用任何实参初始化时调用的构造函数。
如果类定义没有构造函数,编译器假定类具有隐式定义的默认构造函数。因此,在像这样声明一个类之后:
class Example {
public:
int total;
void accumulate(int x) { total += x; }
};
编译器假设Example有一个默认构造函数。因此,这个类的对象可以通过简单地声明而不带任何实参来构造:
Example ex;
但是,一旦类的构造函数接受任意数量的显式声明形参,编译器就不再提供隐式默认构造函数,也不再允许声明该类的新对象而不带实参。例如,以下类:
class Example2 {
public:
int total;
Example2 (int initial_value) : total(initial_value) { };
void accumulate (int x) { total += x; };
};
在这里,我们声明了一个具有int类型形参的构造函数。因此下面的对象声明是正确的:
Example2 ex (100); // ok: calls constructor
但以下:
Example2 ex; // not valid: no default constructor
无效,因为类声明时使用了带有一个实参的显式构造函数,它取代了不带任何实参的隐式默认构造函数。
因此,如果需要在不带实参的情况下构造该类的对象,则还应在该类中声明适当的默认构造函数。例如:
// classes and default constructors
#include
#include
using namespace std;
class Example3 {
string data;
public:
Example3 (const string& str) : data(str) {}
Example3() {}
const string& content() const {return data;}<