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

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;
}

成員參數的參數,類成員以及全局變數的名詞盡量不要相同