1. 程式人生 > >c++的const和static區別

c++的const和static區別

const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。

static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。一般類的靜態函式幾乎就是一個全域性函式,只不過它的作用域限於包含它的檔案中。

在C++中,static靜態成員變數不能在類的內部初始化。在類的內部只是宣告,定義必須在類定義體的外部,通常在類的實現檔案中初始化,如:double Account::Rate=2.25;static關鍵字只能用於類定義體內部的宣告中,定義時不能標示為static

在C++中,const成員變數也不能在類定義處初始化,只能通過建構函式初始化列表進行,並且必須有建構函式。

const資料成員 只在某個物件生存期內是常量,而對於整個類而言卻是可變的。因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。所以不能在類的宣告中初始化const資料成員,因為類的物件沒被建立時,編譯器不知道const資料成員的值是什麼。

const資料成員的初始化只能在類的建構函式的初始化列表中進行。要想建立在整個類中都恆定的常量,應該用類中的列舉常量來實現,或者static const。

class Test  
{  
public:  
      Test():a(0){}  
      enum {size1=100,size2=200};  
private:  
      const int a;//只能在建構函式初始化列表中初始化  
       static int b;//在類的實現檔案中定義並初始化  
      const static int c;//與 static const int c;相同。  
};  
  
int Test::b=0;//static成員變數不能在建構函式初始化列表中初始化,因為它不屬於某個物件。  
cosnt int Test::c=0;//注意:給靜態成員變數賦值時,不需要加static修飾符。但要加cosnt  

cosnt成員函式主要目的是防止成員函式修改物件的內容。即const成員函式不能修改成員變數的值,但可以訪問成員變數。當方法成員函式時,該函式只能是const成員函式。

      static成員函式主要目的是作為類作用域的全域性函式。不能訪問類的非靜態資料成員。類的靜態成員函式沒有this指標,這導致:1、不能直接存取類的非靜態成員變數,呼叫非靜態成員函式2、不能被宣告為virtual

關於static、const、static cosnt、const static成員的初始化問題:

1、類裡的const成員初始化:

在一個類裡建立一個const時,不能給他初值

class foo  
{  
public:  
      foo():i(100){}  
private:  
      const int i=100;//error!!!  
};  
//或者通過這樣的方式來進行初始化  
foo::foo():i(100)  
{}  

2、類裡的static成員初始化:

      類中的static變數是屬於類的,不屬於某個物件,它在整個程式的執行過程中只有一個副本,因此不能在定義物件時 對變數進行初始化,就是不能用建構函式進行初始化,其正確的初始化方法是:

資料型別 類名::靜態資料成員名=值;

class foo  
{  
public:  
      foo();  
private:  
      static int i;  
};  
  
int foo::i=20;  
這表明:  
1、初始化在類體外進行,而前面不加static,以免與一般靜態變數或物件相混淆  
2、初始化時不加該成員的訪問許可權控制符private、public等  
3、初始化時使用作用域運算子來表明它所屬的類,因此,靜態資料成員是類的成員而不是物件的成員。  
 

3、類裡的static cosnt 和 const static成員初始化

      這兩種寫法的作用一樣,為了便於記憶,在此值說明一種通用的初始化方法:

class Test  
{  
public:  
      static const int mask1;  
      const static int mask2;  
};  
const Test::mask1=0xffff;  
const Test::mask2=0xffff;  
//它們的初始化沒有區別,雖然一個是靜態常量一個是常量靜態。靜態都將儲存在全域性變數區域,其實最後結果都一樣。可能在不同編譯器內,不同處理,但最後結果都一樣。  

這是一個完整的例子:

#ifdef A_H_  
#define A_H_  
#include <iostream>  
using namespace std;  
class A  
{  
public:  
      A(int a);  
      static void print();//靜態成員函式  
private:  
      static int aa;//靜態資料成員的宣告  
       static const int count;//常量靜態資料成員(可以在建構函式中初始化)  
       const int bb;//常量資料成員  
};  
int A::aa=0;//靜態成員的定義+初始化  
const int A::count=25;//靜態常量成員定義+初始化  
A::A(int a):bb(a)//常量成員的初始化  
{  
      aa+=1;  
}  
void A::print()  
{  
      cout<<"count="<<count<<endl;  
      cout<<"aa="<<aa<<endl;  
}  
#endif  
void main()  
{  
      A a(10);  
      A::print();//通過類訪問靜態成員函式  
      a.print();//通過物件訪問靜態成員函式  
}  

相關推薦

c++的conststatic區別

const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。 static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。一般

C++ const static的總結以及使用

局部變量 數值 功能 const 常量 指針 main this指針 同名 this 一 static的使用 (作用域和存儲方式) 1.作用域---------->隱藏 靜態函數跟靜態全局變量的作用類似 (靜態函數不能被其它文件所用; 其它文件中可以定義相同名字的函

C++ staticconststatic const型別成員變數宣告及其初始化

C++ static、const和static const型別成員變數宣告及其初始化 const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。 static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具

C++中conststatic修飾場景描述

         在c++中,     static可以在兩種情景下使用,分別是類外和類內; 其中類外的修飾物件可以是區域性變數和全域性變數,被

C++面試題——const static

雖說不太喜歡這種問語言特性的題目,但是國內好多公司貌似就喜歡問這個,還覺得問這個很高階,就把他們常問的一些東西寫下來做個總結,有的東西還是有些意思的,有些東西其實都沒個固定的答案。不出意外將會寫一個系列包括: const和static的區別iterator和引用的實現以及

C++ staticconststatic const型別成員變數宣告以及初始化

下面的文章是我從網上找了好久,整理了好久的,對我有很大幫助,原址已經記不住了,算我自己原創的了哇! const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。 static表示的是靜態的。類的靜態成員函式、靜態成員變

C++ const constexpr 的區別

語義上: constexpr:告訴編譯器我可以是編譯期間可知的,盡情的優化我吧。 const:告訴程式設計師沒人動得了我,放心的把我傳出去;或者放心的把變數交給我,我啥也不動就瞅瞅。 語法上: constexpr是一種比const 更嚴格的束縛, 它修飾的表示式本身在編譯期間可知, 並且編譯器會盡可能的 e

conststatic const區別

一、const關鍵字如果把const放在變數型別名前,說明這個變數的值是保持不變的,該變數必須在定義時初始化,初始化後對它進行的任何賦值都是非法的。當指標或者引用指向一個常量時,必須在型別名前使用const標識這個指標或者引用指向的“變數”為常量,沒有的話就是語法錯誤。如: const int x = 5; 

CC++ const用法的區別

C/C++ const用法的區別 區別一:const定義的常量: const定義的常量: C語言:當修飾一個識別符號的時候我們來說,這個識別符號依然是一個變數,但是它具有常屬性

C語言中關鍵字作用(conststaticextern)

儲存型別關鍵字(4個): auto: 宣告自動變數,現在一般不用(auto int a;和int a;一樣) register: 宣告暫存器變數 static: 宣告靜態變數。該變數宣告時系統所分配的

C++學習 之 staticconststatic const

const定義的常量在超出其作用域之後其空間會被釋放,而static定義的靜態常量在函式執行後不會釋放其儲存空間。static表示的是靜態的。類的靜態成員函式、靜態成員變數是和類相關的,而不是和類的具體物件相關的。即使沒有具體物件,也能呼叫類的靜態成員函式和成員變數。一般類的

iOS中conststatic區別聯絡

const就是隻讀的意思,只在宣告中使用; static一般有2個作用,規定作用域和儲存方式.對於區域性變數,static規定其為靜態儲存方式,每次呼叫的初始值為上一次呼叫的值,呼叫結束後儲存空間不釋放; 對於全域性變數,如果以檔案劃分作用域的話,此變數只在當前檔案可見;對

C# showshowdialog區別

更多 comm isp 應該 常見 解釋 方式 不存在 close 簡單地說他們的區別就是show彈出來的窗體和父窗體(上一個窗體的簡稱)是屬於同一等級的,這兩個窗體可以同時存在而且可以隨意切換,但是showdialog彈出來的窗體就不能這樣,他永遠是被置頂的,如果

C++ new malloc 區別

clas 區別 let void 操作符 類型 new 需要 調用 1.分配地方不同,malloc是堆上面,new是自由存儲區域 2.malloc/delete是函數,new/delete是操作符,可以重載 3.malloc 要指定大小,返回的是void*指針,開辟的是空空

c++ conststaticstatic const修飾的類資料成員變數如何初始化

const資料成員變數: const資料成員為整個類所共有,一旦初始化,不允許修改。其初始化方式一:建構函式初始化列表方式(C++98) 示例: //------------main.cpp #include <iostream> #include <string>

const#define區別

define巨集是在預處理階段展開。const常量是編譯、執行階段使用 巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查 所有的巨集替換隻是簡單的字串替換,注意是字串替換,所以並不會檢查其合法性,而const定義的常量依然是內建型別等,所以會對其進行型別安全檢

c++中->.的區別

->用在指標型別的類例項的,而.用在例項化物件的指向。 下面是例子 #include <iostream> using namespace std; class Complex { private: double real; double image;

C# new orverride 區別

主要還是參考微軟的說明,原文:http://msdn.microsoft.com/zh-cn/library/ms173153.aspx 以下是我的理解: 一、BaseClass(父類、基類): orverrideBaseClass 中的方法必須宣告為 virtual,

C++/C中!~的區別與作用

區別: !是邏輯運算子(與||,&&是一類符號),表示邏輯取反,可以把非0值變成0,把0值變為1 ~是位運算子(與|,&是一類符號),表示按位取反,在數值的二進位制表示上,將0變為1,將1變為0 例子: #include<io

c# InvokeBeginInvoke 區別

Control.Invoke 方法 (Delegate) :在擁有此控制元件的基礎視窗控制代碼的執行緒上執行指定的委託。 Control.BeginInvoke 方法 (Delegate) :在建立控制元件的基礎控制代碼所線上程上非同步執行指定委託。 (一)Control的