C++自动提供了下面这些成员函数:
• 默认构造函数,如果没有定义构造函数;
• 默认析构函数,如果没有定义;
• 复制构造函数,如果没有定义;
新建一个对象并将其初始化为同类现有对象时,复制构造函数都将被调用。该函数逐个复制非静态成员(成员复制也称为浅复制),复制的是成员的值。也可以根据自己的需要显式的定义复制构造函数来完成自己所需的功能。
如果类中包含使用new初始化的指针成员,应当定义一个复制构造函数,已复制指向的数据,而不是指针,这被称为深度复制。
• 赋值构造函数,如果没有定义;
C++允许类对象赋值,这是通过自动为类重载赋值运算符实现的。
StringBad knot;
knot = headlinel;
StringBad metoo = knot;
上述代码实现的时候可能分两步来处理这条语句:使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中,这就是说初始化时总会调用复制构造函数,而使用=运算符时也可能调用赋值运算符。
• 地址运算符,如果没有定义;
C++11提供了另外两个特殊成员函数:移动构造函数和移动赋值运算符。
静态类成员函数
可以将成员函数声明为静态的(函数声明必须包含关键字static,但如果函数定义式独立的,则其中不能包含关键字static)。
首先,不能通过对象调用静态成员函数;实际上静态成员函数不能使用this指针,如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。
其次,由于静态成员函数不与特定的对象相关联,因此只能使用静态数据成员。