首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C++ 空類預設隱式宣告的成員函數:哪些會生成、哪些不會

     編輯:關於C

常見誤區

許多教材(包括《Effective C++》早期版本)聲稱空類:

class Empty {};

等價於:

class Empty {
public:
    Empty();
    Empty(const Empty&);
    ~Empty();
    Empty& operator=(const Empty&);
    Empty* operator&();
    const Empty* operator&() const;
};

標準真相(C++03 / C++11 確認)

根據 ISO/IEC 14882 §12「特殊成員函數」:

  • 隱式宣告(隱式定義)的:
    • 預設建構函數
    • 拷貝建構函數
    • 拷貝賦值運算子
    • 解構函數
  • 不會隱式宣告:
    • 取址運算子 operator&()(無論 const 或非 const)

編譯器直接使用內建取址運算子,而非產生成員函數。這不是全域 operator& 的應用,而是語言內建行為。

Scott Meyers 的更正

作者於勘誤表確認:

A class declaring no operator& function(s) does NOT have them implicitly declared. Rather, compilers use the built-in address-of operator whenever & is applied to an object of that type.

實驗驗證

#include <iostream>
struct Empty {};
int main() {
    Empty e;
    std::cout << &e << '\n';  // 正常編譯,使用內建 operator&
    // Empty::operator&() 並不存在
}

總結

成員函數隱式宣告備註
預設建構函數是無使用者宣告建構函數時
拷貝建構函數是非刪除、非移動情況
移動建構函數 (C++11)條件無使用者宣告拷貝/移動/解構
拷貝賦值是
移動賦值 (C++11)條件
解構函數是非虛擬、非刪除
operator&()否使用內建運算子
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved