亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C++中static函數與static變量的區別

C++中static函數與static變量的區別

C++
波斯汪 2019-03-23 15:15:15
#include <iostream>using namespace std;static void display(){int i=1; cout<<"i="<<i<<endl;i++;}void main(){for(int z=1;z<=10;z++){display();}}這個的程序的結果是10次:1如果把display()函數改為 void display(){static int i=1; cout<<"i="<<i<<endl;i++;}結果是:1,23......10
查看完整描述

3 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤.
1.靜態函數有兩種,類中的成員函數和你說的這種,就是全局的,靜態的全局函數表示只能被當前“.cpp”文件所使用,當外部用extern關鍵字聲明之后也是無法使用的,如果不是靜態函數,外部只要用extren聲明一次就可以調用這個函數了;

2.靜態變量要分為3種,a.類中的成員;b.函數中的靜態變量;c.靜態全局變量;
靜態全局變量和靜態全局函數一樣,只能被包含的“.cpp”文件調用,外部無法用extern聲明并使用;類中的成員其實可以當作一個全局變量,不過它的特點是只能用在該類里面,它并不屬于任何一個成員,而是屬于整個類;

static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝.

在全局變量之前加上關鍵字static,全局變量就被定義成為一個全局靜態變量。
1)內存中的位置:靜態存儲區(靜態存儲區在整個程序運行期間都存在)
2)初始化:未經初始化的全局靜態變量會被程序自動初始化為0(自動對象的值是任意的,除非他被顯示初始化)
3)作用域:全局靜態變量在聲明他的文件之外是不可見的。準確地講從定義之處開始到文件結尾。

c語言中static的語義
1.static變量:
1).局部
a.靜態局部變量在函數內定義,生存期為整個源程序,但作用域與自動變量相同,只能在定義該變量的函數內使用。退出該函數后, 盡管該變量還繼續存在,但不能使用它。
b.對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值。而對自動變量不賦初值,則其值是不定的。

2).全局全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。但是他們的作用域,非靜態全局 變量的作用域是整個源程序(多個源文件可以共同使用); 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。
2.static函數(也叫內部函數)
只能被本文件中的函數調用,而不能被同一程序其它文件中的函數調用。區別于一般的非靜態函數(外部函數) static在c里面可以用來修飾變量,也可以用來修飾函數。 先看用來修飾變量的時候。變量在c里面可分為存在全局數據區、棧和堆里。其實我們平時所說的堆棧是棧而不包含對,不要弄混。

 


查看完整回答
反對 回復 2019-03-24
?
料青山看我應如是

TA貢獻1772條經驗 獲得超8個贊

1.靜態函數有兩種,類中的成員函數和你說的這種,就是全局的,靜態的全局函數表示只能被當前“.cpp”文件所使用,當外部用extern關鍵字聲明之后也是無法使用的,如果不是靜態函數,外部只要用extren聲明一次就可以調用這個函數了;

2.靜態變量要分為3種,a.類中的成員;b.函數中的靜態變量;c.靜態全局變量;
靜態全局變量和靜態全局函數一樣,只能被包含的“.cpp”文件調用,外部無法用extern聲明并使用;類中的成員其實可以當作一個全局變量,不過它的特點是只能用在該類里面,它并不屬于任何一個成員,而是屬于整個類;
接下來是你說的函數中的靜態變量,其實也和類中的差不多,可以把它當作全局變量使用,但特殊的是這個全局變量只能在該函數內使用。

比如,你的第二種情況,如果函數中刪去“static int i=1;”,然后增加一個全局變量int i = 1;,運行結果是一樣的,即1.2.3......10,但是如果改成全局變量,不僅能在函數外部使用這個變量,還能在外部用extern關鍵字聲明“extern int i;”之后再使用該變量,這樣會造成數據的不安全性。



查看完整回答
反對 回復 2019-03-24
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

1:前面你用的是static成員函數,該static關鍵字在此處的意思是:該函數屬于整個類的,不是在某一個具體對象的,也就是說你可以通過類名::函數名來調用。注意:靜態成員函數中不能引用非靜態的成員變量。
2:后面的static修飾的是局部變量,也就是說 i 在函數里面每次的值,增加之后是不變的。原因是:
static 是在靜態數據存儲區上分配內存。而普通的局部變量是在棧上分配內存,也就是說如果 i 是在棧上分配內存的話,每次函數調用完成之后,就會收回內存,i 的值每次都為1.

查看完整回答
反對 回復 2019-03-24
  • 3 回答
  • 0 關注
  • 1085 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號