C++中的空类,编译器默认可以产生哪些成员函数
class Empty {};
默認(rèn)會(huì)生成4個(gè)函數(shù),其函數(shù)的原型如下:
public: Empty() { ... }
?Empty(const Empty& rhs) { ... }?
?~Empty() { ... }?
?Empty& operator=(const Empty& rhs) { ... }
說(shuō)明:1) 這些函數(shù)只有在需要調(diào)用的時(shí)候,編譯器才會(huì)生成。
2) 4個(gè)函數(shù)都是public的。
3) 4個(gè)函數(shù)都是inline的(即函數(shù)定義在類的定義中的函數(shù))。
4) 如果你顯式的聲明了這些函數(shù)中的任何一個(gè)函數(shù),那么編譯器將不再生成默認(rèn)的函數(shù)。
比如,當(dāng)遇到下列語(yǔ)句時(shí),函數(shù)會(huì)被編譯器生成:Empty e1; //默認(rèn)構(gòu)造函數(shù)?
?//對(duì)象銷(xiāo)毀時(shí),析構(gòu)函數(shù)Empty e2(e1); //
拷貝構(gòu)造函數(shù)e2 = e1; //賦值運(yùn)算符
另外,還存在兩種默認(rèn)的函數(shù):就是取地址運(yùn)算符和取地址運(yùn)算符的const版本,這兩個(gè)函數(shù)在《Effective C++》中沒(méi)有提及。public: Empty* operator&() { ... }
const Empty* operator&() const { ... }
這兩個(gè)函數(shù)是確實(shí)存在的,正如下面的代碼可以正常工作:#include <stdio.h>class Empty {};
int main(int argc, char** argv)
{ Empty a;?
?const Empty *b = &a; printf("%p/n", &a); //調(diào)用取地址運(yùn)算符
?printf("%p/n", b); //調(diào)用const取地址運(yùn)算符}
一個(gè)容易被忽略的問(wèn)題:自定義的拷貝構(gòu)造函數(shù)不僅會(huì)覆蓋默認(rèn)的拷貝構(gòu)造函數(shù),也會(huì)覆蓋默認(rèn)的構(gòu)造函數(shù)。下面的代碼是編譯不過(guò)的,用戶必須再顯式的定義一個(gè)無(wú)參的構(gòu)造函數(shù)。class Empty {
public: Empty(const Empty& e) { }?
?//拷貝構(gòu)造函數(shù)};
int main(int argc, char** argv){ Empty a;}
總結(jié)
以上是生活随笔為你收集整理的C++中的空类,编译器默认可以产生哪些成员函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: AMD规范:简单而优雅的动态载入Java
- 下一篇: s3c2440移植MQTT