7.4.0 類定義時的處理流程
- 先編譯成員的宣告
- 所有成員可見後,編譯函式體
7.4.1 一般的名字查詢流程
- 在所在塊內尋找宣告,只找名字之前的部分
- 沒找到則去外層作用域找
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;
}
成員引數的引數,類成員以及全域性變數的名詞儘量不要相同