编译器为类创建的所有成员函数是什么?这种事经常发生吗?

编译器为类创建的所有成员函数是什么?这种事经常发生吗?

编译器为类创建的所有成员函数是什么?这种事经常发生吗?就像破坏者一样。我关心的是它是否是为所有类创建的,为什么需要默认构造函数?



繁花如伊
浏览 385回答 3
3回答

互换的青春

C+98/03如果需要的话,编译器将生成一个默认构造函数除非您声明了您自己的任何构造函数。编译器将生成一个复制 构造器除非你宣布属于你自己。编译器将生成一个复制 赋值算子除非你宣布属于你自己。编译器将生成一个破坏者除非你宣布属于你自己。正如Péter在一篇有帮助的评论中所说的,所有这些都是由编译器生成的。当他们需要的时候..(区别在于,当编译器无法创建它们时,只要不使用它们,就可以了。)C+11C+11添加以下规则,对于C+14也是如此(托利的信用额,见本评论):编译器生成移动 构造器如果没有用户声明。复制 构造器,和没有用户声明。复制 赋值算子,和没有用户声明。移动 赋值算子和没有用户声明。破坏者,它是不标记为删除,所有的成员和基地可动.类似于移动 赋值算子如果没有定义用户,则生成没有用户声明。复制 构造器,和没有用户声明。复制 赋值算子,和没有用户声明。移动 构造器和没有用户声明。破坏者,它是不标记为删除,所有的成员和基地可动.请注意,这些规则比C+03规则更详细,在实践中更有意义。为了更容易地理解上面提到的项目是什么Thing:class Thing {public:     Thing();                        // default constructor     Thing(const Thing&);            // copy c'tor     Thing& operator=(const Thing&); // copy-assign     ~Thing();                       // d'tor     // C++11:     Thing(Thing&&);                 // move c'tor     Thing& operator=(Thing&&);      // move-assign};作为进一步的阅读,如果您是C+初学者,请考虑不需要您实现最后五个中的任何一个的设计,即a。零规则 (由马蒂尼奥·费尔南德斯).

RISEBY

你是指“被创造”的“定义”吗?$12.1-“默认构造函数(12.1)、复制构造函数和复制赋值操作符(12.8)和析构函数(12.4)是特殊的成员函数。如果“创建”意味着“定义”,那么下面是C+标准中的重要部分。-当类用于创建类型(1.8)的对象时,隐式地定义类的默认构造函数。-如果类没有用户声明的析构函数,则将隐式声明析构函数。隐式声明的析构函数在用于销毁其类型的对象时被隐式定义。-如果类定义没有明确声明副本构造函数,则将隐式声明副本构造函数。如果隐式声明的副本构造函数用于从类型的对象或从类型派生的类型的副本中初始化类型的对象,则隐式声明的副本构造函数是隐式定义的。-如果类定义没有明确声明副本赋值操作符,则将隐式声明一个副本赋值操作符。当为类型的对象分配类型的值或从类型派生的类型的值时,隐式声明的副本赋值运算符将被隐式定义。

宝慕林4294392

默认情况下,如果用户不实现,编译器将向类添加一些成员函数。它们被称为“四大”:默认构造函数复制构造函数复印操作员(作业)破坏者根据成员的类型和列出的成员函数您自己提供的,这些将不会全部生成。
打开App,查看更多内容
随时随地看视频慕课网APP