Learning C++ 之 1.4d 變量的局部範圍講解

在1.3中已經學習了CPU執行如下語句的過程:int x;這個過程叫做變量的實例化(創建)

所以問題就來了,“什麼時候一個實例化的變量銷燬呢?”

銷燬的時機:

一個變量的適用範圍取決於該變量初始化的時候。函數的參數和函數內部的變量都有局部的適用範圍。就是說這些變量只有在這些定義它的函數內部有效。局部變量開始生效的時間就是定義的時候,銷燬的時間就是函數執行結束的時候(通常是在函數的最後面)。

下面是一個簡單的例子:

#include <iostream>
 
int main()
{
    int x; // variable x is created here
    std::cout << "Enter a value for x: ";
    std::cin >> x;
    std::cout << "You entered: " << x << std::endl;
 
    return 0;
} // variable x is destroyed here

下面是一個稍微複雜點的例子:

#include <iostream>
 
int add(int x, int y) // x and y are created here
{
    // x and y are visible/usable within this function only
    return x + y;
} // x and y go out of scope and are destroyed here
 
int main()
{
    int a = 5; // a is created and initialized here
    int b = 6; // b is created and initialized here
    // a and b are usable within this function only
    std::cout << add(a, b) << std::endl; // calls function add() with x=a and y=b
    return 0;
} // a and b go out of scope and are destroyed here

在add()函數裏,x和y創建的時機就是函數被調用的時候,x和y的有效區間就是在add函數內部,銷燬的時機在add函數調用完成之後。

變量啊a和b在main()函數裏面,創建的時機就是定義的時候,銷燬的時機就是main()函數執行完成的時候。

爲了加強你的理解,我們一步步地跟蹤一下代碼:

  • main()函數被觸發
  • main()函數中的變量a被初始化,並賦值5
  • main()函數中的變量b被初始化,並賦值6
  • add()函數被調用,a,b作爲參數傳入
  • add()中的變量x被創建,並賦值5
  • add()中的變量y被創建,並賦值6
  • +運算符將x和y相加得到11
  • 通過return語句將11返給main()函數
  • add函數中的x和y被銷燬
  • main函數打印11到輸出平臺上
  • main函數返回0給操作系統
  • main的a和b變量被銷燬

由此可見,如果add()函數被調用兩次,那麼變量x和y也會創建和銷燬兩次。

上面的例子中可以明確地看到x和y變量與a和b變量是不同的。

下面看一下另一個程序:

#include <iostream>
 
int add(int x, int y) // add's x and y are created here
{
    return x + y;
} // add's x and y go out of scope and are destroyed here
 
int main()
{
    int x = 5; // main's x is created here
    int y = 6; // main's y is created here
    std::cout << add(x, y) << std::endl; // the values from main's x and y are copied into add's x and y
    return 0;
} // main's x and y go out of scope and are destroyed here

在這個例子中,我們把main函數中的a和b變量改成了x和y,我們執行以下發現依然可以正常執行。即使add()函數和main()函數都有x和y變量。這是爲什麼呢?

首先我們需要明確儘管main函數和add函數中都有相同的變量x和y,但是這兩對變量是有明顯區別的。main函數中的變量和add函數中的變量毫無關係,知識名字相同而已。

其次,在main函數中,x和y指的是局部main函數中的變量,這兩個變量只有在main函數中有效。而在add函數中的x和y變量代表的是函數的參數,只在add函數中有效。

簡單地說,無論是main函數還是add函數有相同的變量名字,編譯器都能明確地區分開這些變量。也就是說函數並不需要關係變量的命名名稱,這對我們來說是非常明智簡單的。

在後續的過程中,我們會深入地學習局部範圍和其他形式的範圍,可以參考第4章。

對於函數的參數或者內部變量來說,這些變量只針對該函數有效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章