7-3 名字查找與類的作用域
- 2022 年 2 月 20 日
- 筆記
- C++ Primer(英文版)筆記
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;
}
成員參數的參數,類成員以及全局變數的名詞盡量不要相同