7-3 名字查詢與類的作用域

咪啪魔女發表於2022-02-20

7.4.0 類定義時的處理流程

  • 先編譯成員的宣告
  • 所有成員可見後,編譯函式體

7.4.1 一般的名字查詢流程

  1. 在所在塊內尋找宣告,只找名字之前的部分
  2. 沒找到則去外層作用域找

7.4.2 類成員的名字查詢

同一般的名字查詢流程,現在類內找,沒找到再去外層找

typedef double Money;
string bal;
class Account{
public :
    Money balance() {return bal;}
private :
    Money bal;
    // ...
};

先編譯Acount類內的成員 bal, bal的型別是Money,現在類內尋找Money的宣告,沒有找到,則去類外找,找到了typedef double Money

編譯完成員後編譯函式體return bal;,現在類內尋找bal,找到Money bal,所以此時的返回的是Money bal而不是string bal

7.4.3 類成員函式定義中的名字查詢

  • 現在成員函式內查詢
  • 再在類內查詢
  • 最後去外層作用域查詢
int height = 1;
class text{
public :
    void h(int height){
        cout<<height; //輸出的是引數height
    }
private :
    int height = 3;
};
int main(){
    text t;
    t.h(2);  //輸出:2
    return 0;
}
#include<iostream>
using namespace std;
int height = 1;
class text{
public :
    void h(int ht){
        cout<<height; //輸出的是類成員height
    }
private :
    int height = 3;
};
int main(){
    text t;
    t.h(2);   //輸出:3
    return 0;
}
#include<iostream>
using namespace std;
int height = 1;
class text{
public :
    void h(int ht){
        cout<<height; //輸出的是全域性變數height
    }
private :
    int HT = 3;
};
int main(){
    text t;
    t.h(2);   //輸出:1
    return 0;
}

成員引數的引數,類成員以及全域性變數的名詞儘量不要相同

相關文章