C ++中Class的隐式成员函数是: 根据维基: http://en.wikipedia.org/wiki/Special_member_functions
默认构造函数(如果没有显式声明其他构造函数)
如果没有显式声明移动构造函数或移动赋值运算符,则复制构造函数。如果声明了析构函数,则不推荐生成复制构造函数。
如果没有显式声明复制构造函数,移动赋值运算符或析构函数,则移动构造函数。
如果没有显式声明移动构造函数或移动赋值运算符,则复制赋值运算符。如果声明了析构函数,则不推荐生成复制赋值运算符。
如果没有显式声明复制构造函数,复制赋值运算符或析构函数,则移动赋值运算符。
析构
根据以下链接:
http://archives.cs.iastate.edu/documents/disk0/00/00/02/43/00000243-02/lcpp_136.html
默认构造函数(即没有参数的构造函数,(第12.1节[Ellis-Stroustrup90]),如果没有声明该类的构造函数(包含任意数量的参数)。
复制构造函数(第12.1节[Ellis-Stroustrup90]),如果没有声明复制构造函数。
析构函数(第12.4节[Ellis-Stroustrup90]),如果没有声明析构函数。
赋值运算符([Ellis-Stroustrup90]的第5.17和12.8节),如果没有声明赋值运算符。
根据以下链接:
http://www.picksourcecode.com/ps/ct/16515.php
默认构造函数
复制构造函数
赋值运算符
默认析构函数
地址运营商
有人可以给出以下代码示例:移动构造函数,复制赋值运算符,移动赋值运算符,赋值运算符,地址运算符 它们被用作隐式成员函数而未明确定义。
由于
答案 0 :(得分:3)
#include <iostream>
/* Empty struct. No function explicitly defined. */
struct Elem
{ };
/* Factory method that returns an rvalue of type Elem. */
Elem make_elem()
{ return Elem(); }
int main() {
/* Use implicit move constructor (the move may be elided
by the compiler, but the compiler won't compile this if
you explicitly delete the move constructor): */
Elem e1 = make_elem();
/* Use copy assignment: */
Elem e2;
e2 = e1;
/* Use move assignment: */
e2 = make_elem();
/* Use address operator: */
std::cout << "e2 is located at " << &e2 << std::endl;
return 0;
}
上面的示例使用了一个空类。您可以使用具有真实移动语义的数据成员(即移动与复制完全不同的成员)填充它,例如,一个std::vector
,您将自动获得移动语义,而无需定义移动构造函数或专门为您的类移动赋值运算符。