首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 結構體靜態成員與建構子參數預設值的作用域解析

     編輯:程式設計綜合問答

程式碼關鍵片段


int x=2, y=x+30;          // 全域變數
struct A {
    static int x;         // 靜態成員
    int y;                // 實例成員
    A(int x=::x+2, int y=::y+3) { A::x=x; A::y=y; }  // 建構子
    // ...
};
int A::x=23;              // 靜態成員定義

名稱查找規則

位置名稱解析為說明
建構子參數預設值 ::x+2::x全域 x (2):: 強制全域作用域
建構子參數預設值 ::y+3::y全域 y (32)同上
建構子本體 A::x=xA::x靜態成員 A::x類別作用域
建構子本體 A::y=yA::y實例成員 y隱藏參數 x、y
成員函數 h 內 int yy區域變數遮蔽實例成員 y

問題回答

類別內的 `int y` 與建構子參數 `A::y` 是同一個實例成員。建構子參數名稱與成員同名時,參數遮蔽成員,需用 A::y 或 this->y 存取成員。全域 y 僅在建構子預設值運算式中被使用(::y)。

物件建構過程追蹤


A a(54, 3);  // 顯式傳參:x=54, y=3 → A::x=54, a.y=3
A b(65);     // x=65, y=::y+3=35 → A::x=65, b.y=35
A c;         // x=::x+2=4, y=::y+3=35 → A::x=4, c.y=35
// 注意:靜態成員 A::x 被每次建構覆寫,最終為 4

關鍵提醒

  • 靜態成員屬於類別,所有實例共享,A a, b, c 最後 A::x = 4。
  • 建構子參數預設值在呼叫點評估,使用當時可見的全域變數值。
  • 成員函數區域變數會遮蔽同名成員,慎用同名。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved