iT邦幫忙

0

【C++學習筆記】03《你的變數不是你的變數》

  • 分享至 

  • xImage
  •  

嗨,大家好,我是 Kevin Lee,一位正在轉職軟體工程師的遊戲技術美術。
我會在這裡記錄自己的程式學習筆記,方便日後複習,也分享給和我一樣非本科、想踏入程式世界的朋友。
歡迎一起交流,請多多指教。

【C++學習筆記】02《從資料型態到命名規則》


一、可視範圍(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)則用來在全域層級上區隔不同模組,避免名稱衝突。
在名稱查找過程中,編譯器會同時考慮作用域與命名空間,因此清楚的作用域管理與明確的命名空間設計,能讓程式碼行為更直觀、可預期,也更容易維護。


如果你也是非本科背景,或正準備開始學習程式,希望這篇筆記能對你有所幫助。
這裡會持續記錄我在轉職過程中對程式、軟體工程與實務學習的理解,歡迎一起交流,也歡迎指教。
如果這篇內容對你有幫助,歡迎收藏或分享給正在學習程式的朋友。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言