嗨,大家好,我是 Kevin Lee,一位正在轉職軟體工程師的遊戲技術美術。
我會在這裡記錄自己的程式學習筆記,方便日後複習,也分享給和我一樣非本科、想踏入程式世界的朋友。
歡迎一起交流,請多多指教。
一、可視範圍(Scope)是什麼?
可視範圍(Scope)決定了「某個名字(變數、函式、型別、namespace成員…)在哪些程式碼範圍內可以被看到、被使用」。
一般來說,以{}做為區塊區分,在合法區域的同名稱變數下,越內層的區塊會遮蔽外層區塊。
#include<iostream>
int x = 10; //全域變數(Global variable)
int main()
{
int x = 20; //區域變數(Local variable)
{
int x = 30; //巢狀區域變數(Nested local variable)
std::cout << x << std::endl; // Outputs 30
}
std::cout << x << std::endl; // Outputs 20
std::cout << ::x << std::endl; // Outputs 10
return 0;
}
二、for/if的「初始化宣告」也有自己的 scope
前面提到,越內層的區塊會遮蔽外層區塊,同樣適用於for/if/function中的{}
for (int i = 0; i < 3; i++) {
// i 只在這個 for 的控制範圍與 block 內有效
}
// cout << i; // ❌ 編譯錯:i 不在 scope
三、類別繼承時:衍生類別同名會「遮蔽基底類別同名集合」
以下範例,在講到類別的時候會再補充細節。
#include <iostream>
using namespace std;
struct Base
{
void foo(int) { cout << "Base::foo(int)\n"; }
void foo(double) { cout << "Base::foo(double)\n"; }
};
struct Derived : Base
{
void foo(string) { cout << "Derived::foo(string)\n"; } //會遮蔽Base的foo(int/double)
};
int main()
{
Derived d;
// d.foo(10); // ❌ 你以為會叫Base::foo(int),但Base::foo全被遮蔽了->編譯錯
d.foo("hi"); // OK
d.Base::foo(10); // OK,明確指定要呼叫Base的foo(int)
d.Base::foo(3.14); // OK,明確指定要呼叫Base的foo(double)
return 0;
}
四、命名空間(Namespace)
命名空間(Namespace),是透過語法namespace替全域名稱做群組分類。
#include <iostream>
namespace abc
{
int x;
int b;
}
int main()
{
abc::x = 10;//存取透過"命名空間名稱"::變數名稱
abc::b = 20;
std::cout << "Value of x: " << abc::x << std::endl;
std::cout << "Value of b: " << abc::b << std::endl;
return 0;
}
使用using namespace就可以直接存取變數,不需要透過"命名空間名稱"::
#include <iostream>
namespace abc
{
int x;
int b;
}
//using namespace
using namespace abc;
using namespace std;
int main()
{
x = 10;
b = 20;
cout << "Value of x: " << x << endl;
cout << "Value of b: " << b << endl;
return 0;
}
優點:少打字
代價:把namespace裡一堆名字倒進目前scope,容易:
◆跟你自己的函式/變數同名衝突
◆造成overload resolution變複雜
◆大型專案可讀性下降
可視範圍(scope)與命名空間(namespace)共同決定了名稱在程式中的可見性與歸屬。
可視範圍(scope)控制名稱在程式碼結構中的有效範圍,而命名空間(namespace)則用來在全域層級上區隔不同模組,避免名稱衝突。
在名稱查找過程中,編譯器會同時考慮作用域與命名空間,因此清楚的作用域管理與明確的命名空間設計,能讓程式碼行為更直觀、可預期,也更容易維護。
如果你也是非本科背景,或正準備開始學習程式,希望這篇筆記能對你有所幫助。
這裡會持續記錄我在轉職過程中對程式、軟體工程與實務學習的理解,歡迎一起交流,也歡迎指教。
如果這篇內容對你有幫助,歡迎收藏或分享給正在學習程式的朋友。