C++全局變量局部變量初始化的問題及存儲類修飾符

      網(wǎng)友投稿 1056 2022-05-30

      一般來說,C++ 有三個地方可以聲明變量:

      在函數(shù)或一個代碼塊內(nèi)部聲明的變量,稱為局部變量。

      在函數(shù)參數(shù)的定義中聲明的變量,稱為形式參數(shù)。

      在所有函數(shù)外部聲明的變量,稱為全局變量。

      從上面的定義來看C++全局變量與局部變量就很好區(qū)分了。局部變量只能被函數(shù)內(nèi)部或者代碼塊內(nèi)部的語句使用,而全局變量的值在程序的整個生命周期內(nèi)都是有效的。全局變量可以被任何函數(shù)訪問,在整個程序中都是可用的。

      在程序中,局部變量和全局變量的名稱可以相同,但是在函數(shù)內(nèi),局部變量的值會覆蓋全局變量的值。

      1.局部變量和全局變量的初始化

      局部變量和全局變量的初始化是有區(qū)別的。當(dāng)局部變量被定義時,系統(tǒng)不會對其初始化,必須自行對其初始化。定義全局變量時,系統(tǒng)會自動初始化為下列值:

      2.存儲類說明符

      這些說明符放置在它們所修飾的類型之前,用于定義 C++ 程序中變量/函數(shù)的范圍(可見性)和生命周期:

      auto:auto 存儲類是所有局部變量默認的存儲類

      register:register 存儲類用于定義存儲在寄存器中而不是內(nèi)存中的局部變量。

      static:static 存儲類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在

      extern:extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。

      mutable:僅適用于類的對象,它允許對象的成員替代常量。也就是說,mutable 成員可以通過 const 成員函數(shù)修改。

      C++全局變量與局部變量初始化的問題及存儲類修飾符

      3.static 修飾局部變量

      static 存儲類指示編譯器在程序的生命周期內(nèi)保持局部變量的存在,而不需要在每次它進入和離開作用域時進行創(chuàng)建和銷毀。因此,使用 static 修飾局部變量可以在函數(shù)調(diào)用之間保持局部變量的值。

      static 修飾符也可以應(yīng)用于全局變量。當(dāng) static 修飾全局變量時,會使變量的作用域限制在聲明它的文件內(nèi)。

      在 C++ 中,當(dāng) static 用在類數(shù)據(jù)成員上時,會導(dǎo)致僅有一個該成員的副本被類的所有對象共享。

      #include using namespace std; // 函數(shù)聲明 void func(void); // 全局變量 static int count = 10; int main(){ while(count--){ func(); } return 0; } void func(){ static int i = 5; // 局部靜態(tài)變量 i++; cout << "i = " << i << endl; cout << "count = " << count << endl; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      編譯運行:

      ~/Desktop/c++$ g++ example02.cpp -o example02 ~/Desktop/c++$ ./example02 i = 6 count = 9 i = 7 count = 8 i = 8 count = 7 i = 9 count = 6 i = 10 count = 5 i = 11 count = 4 i = 12 count = 3 i = 13 count = 2 i = 14 count = 1 i = 15 count = 0

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      4.extern 存儲類

      extern 存儲類用于提供一個全局變量的引用,全局變量對所有的程序文件都是可見的。當(dāng)使用 ‘extern’ 時,對于無法初始化的變量,會把變量名指向一個之前定義過的存儲位置。可以在文件中使用 extern 來得到在其他文件中已定義的變量或函數(shù)的引用。

      support.cpp:

      #include using namespace std; int count; // 全局變量 void func_extern(){ cout << "count is " << count << endl; }

      1

      2

      3

      4

      5

      6

      7

      8

      main.cpp:

      #include using namespace std; extern int count;// 使用support.cpp文件中定義的count全局變量 extern void func_extern();// 使用support.cpp文件中定義的函數(shù) int main(){ count = 5; func_extern(); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      編譯運行:

      ~/Desktop/c++$ g++ support.cpp main.cpp -o main ~/Desktop/c++$ chmod 754 main ~/Desktop/c++$ ./main count is 5

      1

      2

      3

      4

      5.mutable

      #include #include using namespace std; class Customer{ private: char name[25]; char order[50]; int tableNumber; mutable int bill; public: Customer(const char* s,const char *m,int a,int b){ strcpy(name,s); strcpy(order,m); tableNumber = a; bill = b; } void changeBill(int s) const{ // 如果bill不是mutable修飾的話,修改bill就是非法的 bill = s; } void display() const{ cout << "name:" << name << endl; cout << "order:" << order << endl; cout << "tableNumber:" << tableNumber << endl; cout << "bill:" << bill << endl; } }; int main(){ // const 修飾了Customer,那么c1就只能調(diào)用const修飾的函數(shù),否則,怎么調(diào)都行 const Customer c1("Tom","Burger",3,100); c1.display(); c1.changeBill(34); c1.display(); return 0; }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      編譯運行:

      ~/Desktop/c++$ g++ mutable.cpp -o mutable ~/Desktop/c++$ ./mutable name:Tom order:Burger tableNumber:3 bill:100 name:Tom order:Burger tableNumber:3 bill:34

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      const Customer c1("Tom","Burger",3,100);這一句將c1變量聲明為常量,說明c1初始化后,就不能再修改,c1調(diào)用任何非const函數(shù)都會報異常。如果調(diào)用const函數(shù)中,修改了非mutable變量,也會報異常。

      mutable的使用場景就是讓const對象中的變量,也可以通過const函數(shù)修改。如果一個客戶訂餐,名字和臺號是不能改變,但是訂單bill會隨著點餐的變化而變化,也就是一個對象有些變量不能改變,有些變量需要改變。mutable就應(yīng)運而生了。

      C 語言 C++

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:【實戰(zhàn)來了】第2期:領(lǐng)跑DevOps領(lǐng)域的華為云DevCloud,為什么這么受青睞
      下一篇:SpringSession系統(tǒng)對接CAS遇到的反序列化問題
      相關(guān)文章
      国产亚洲AV夜间福利香蕉149| 亚洲娇小性色xxxx| 亚洲国产视频久久| 亚洲一卡2卡4卡5卡6卡在线99| 国产成A人亚洲精V品无码性色| 国产亚洲日韩在线a不卡| 国产成人精品久久亚洲高清不卡| 亚洲av日韩av永久在线观看| 亚洲情A成黄在线观看动漫软件| 国产成人精品日本亚洲18图| 亚洲国产成a人v在线| 亚洲一区免费在线观看| 亚洲免费中文字幕| ASS亚洲熟妇毛茸茸PICS| 亚洲欧洲日韩国产一区二区三区| 成人亚洲国产va天堂| 亚洲国产欧美日韩精品一区二区三区 | 久久亚洲精品无码av| 亚洲av日韩av永久无码电影| 久久亚洲中文字幕无码| 一本色道久久88亚洲综合| 亚洲一区二区三区乱码A| 亚洲女久久久噜噜噜熟女| 亚洲AV无码国产精品麻豆天美| 亚洲日本一区二区三区| 亚洲午夜精品国产电影在线观看| 亚洲午夜精品国产电影在线观看| 久久精品国产亚洲AV忘忧草18| 亚洲中文无码亚洲人成影院| WWW国产亚洲精品久久麻豆| 亚洲情a成黄在线观看| 丁香五月亚洲综合深深爱| 亚洲国产第一站精品蜜芽| 亚洲黄色片免费看| 国产精品亚洲综合久久| 亚洲AV日韩精品一区二区三区| 一本色道久久综合亚洲精品高清 | 久久久国产亚洲精品| 性色av极品无码专区亚洲 | 亚洲电影唐人社一区二区| 亚洲天堂2017无码中文|