資料的共享與保護(一)

2021-09-26 10:54:36 字數 3323 閱讀 5722

1>.作用域:

指的是識別符號的有效範圍,乙個識別符號在程式正文中有效的區域;

c++作用域:

(1)函式原型作用域(c++程式中最小的作用域)

(2)區域性作用域(塊作用域)

函式形參列表中形參的作用域,從形參列表中的聲名處開始,到整個函式體結束處為止;函式體內宣告的變數,其作用域從宣告開始,直到宣告所在的塊結束的大括號為止。

(3)類作用域

類:一組有名成員的集合,類x的成員m具有類作用域,對m的訪問方式有3種:

1)如果在x的成員函式中沒有宣告同名的區域性作用域識別符號,那麼在該函式內可以直接訪問成員m。

2)通過表示式x.m或者x::m。這正是程式中訪問物件成員的最基本的方法。

x::m用於訪問類的靜態成員。

3)通過ptr->m這樣的表示式,其中ptr為指向x類的乙個物件的指標。

(4)命名空間作用域(檔案作用域) c++標準程式庫的所有識別符號都被宣告在 std 命名空間中,該空間的變數也稱為: 全域性變數

例1:

#includeusing namespace std;

int i; //在全域性命名空間中的全域性變數

namespace ns

int main()

cout << "i=" << i << endl; //輸出5

return 0;

}執行結果為:

i=7j=6

i=5

注意:具有命名空間作用域的變數也稱為全域性變數。mian函式結束才銷毀。

2>.可見性:

作用域可見性的一般規則如下:

(1) 宣告在前,引用在後;

(2) 在同一作用域中,不能宣告同名的識別符號;

(3) 在沒有互相包含關係的不同的作用域中宣告的同名識別符號,互不影響;

(4)若有兩個或多個具有包含關係的作用域宣告了同名識別符號,則外層識別符號在內層不可見;

注意:作用域和可見性的原則不只使用於變數名,也適用於其他各種識別符號,包括常量名、使用者定義的型別名、函式名、列舉型別的取值等。

1>靜態生存期:

物件的生存期與程式的執行期相同,則它具有靜態生存期。

如果要在函式的區域性作用域中宣告具有靜態生存期的物件,則要使用關鍵字static。

static int i;

區域性作用域中靜態變數特點:它不會隨著函式呼叫而產生乙個副本,也不會隨著函式返回而失效。

注意:定義時未指定初值的基本型別靜態變生存期量,會被賦予0值初始化;

2> 動態生存期:

區域性生存期物件誕生於宣告點,結束於宣告所在的塊執行完畢之時.

模組間對記憶體中資料的共享是通過函式與函式之間的資料共享來實現的,其中包括兩個途徑:引數傳遞,全域性變數。

靜態成員是解決同乙個類的不同物件之間資料與函式共享問題的。

1>靜態資料成員:

乙個類的所有物件具有相同的屬性:指屬性的個數,名稱,資料型別相同,各個物件的屬性值則可以各不相同。

類屬性:描述類的所有物件共同特徵的乙個資料項,對於任何物件例項,它的屬性值是相同的。

靜態資料成員具有靜態生存期。由於靜態資料成員不屬於任何乙個物件,因此可以通過類名對它進行訪問:類名::識別符號。

注意:

之所以類的靜態資料成員需要在類定義之外再加以定義,是因為需要以這樣的方式專門為他們分配空間;非靜態資料成員無須以此方式定義,因為他們的空間是與他們所屬物件的空間同時分配的。

例:具有靜態資料成員的point 類。

#includeusing namespace std;

class point //point類定義

point (point &p) //複製建構函式

~point()

int getx()

int gety()

void showcount() //輸出靜態資料成員

private: //私有資料成員

int x, y;

static int count; //靜態資料成員宣告,用於記錄點的個數

};int point::count = 0; //靜態資料成員定義和初始化,使用類名限定

int main()

執行結果為:

point a:4,5object count=1

point b:4,5object count=2

2>靜態函式成員:

1、靜態成員函式解決的問題:

(1)不依賴物件就可以訪問靜態成員變數;

(2)必須保證靜態成員變數的安全性;

(3)方便快捷得獲取靜態成員變數的值

靜態成員函式的定義:接通過static關鍵字修飾成員函式即可。

為了便於理解,我們先上一段**來理解一下靜態成員函式的性質:

#include class demo

;int demo::geti()

void demo::staticfunc(const char* s)

void demo::staticseti(demo& d, int v)

int main()

以上**執行的結果為:

staticfunc: main begin...

d.i = 20

d.i = 10

staticfunc: main end...

兩個靜態成員函式:

static void staticfunc(const char* s);

static void staticseti(demo& d, int v);

可以看出靜態成員函式的性質大體如下:

(1)靜態成員函式是類中特殊的成員函式

(2)靜態成員函式屬於整個類所有

(3)可以通過類名(作用域訪問)直接訪問公有靜態成員函式

(4)可以通過物件名訪問公有靜態成員函式

(1)靜態成員函式不能訪問普通成員變數(函式),需通過物件間接訪問成員變數(函式);

(2)靜態成員函式是類中的特殊的成員函式

(3)靜態成員函式沒有隱藏的this指標

(4)靜態成員函式可以通過類名直接訪問

(5)靜態成員函式可以通過物件訪問

(6)靜態成員函式只能直接訪問靜態成員變數(函式),而不能直接訪問普通成員變數(函式)

資料共享與保護

作用域 是識別符號的有效範圍 可見性 識別符號是否可以引用的問題 程式執行到某一點。能夠引用到的識別符號,就是該處可見的識別符號。函式原型的作用域 函式原型中的引數,其作用域始於 結束於 例如,設有下列原型宣告 double area double radius radius 的作用域僅在於此,不能...

資料的共享與保護

1.生存期 1 靜態生存期 定義 若物件的生存期與程式的執行期相同,則稱它具有靜態生存期 方式 使用關鍵字static 在命名空間作用域宣告的物件都具有靜態生存期 2 動態生存期 區域性生存期物件誕生於宣告點,結束於宣告所在的塊執行完畢之時。例 變數的生存期與可見性 include using na...

資料的共享與保護 知識梳理一

作用域 作用域是乙個識別符號在程式正文中有效的區域 1.函式原型作用域 在函式原型宣告時形式引數的作用範圍就是函式原型作用域,例如 double area double radius 識別符號radius的作用範圍就在函式area形參列表的左右括號之間,在程式的其他地方不能引用這個識別符號,因此識別...