1. C++ static、const 和 static const 類型成員變量聲明以及初始化
-
const 定義的常量在超出其作用域之后其空間會被釋放;
-
static 定義的靜態(tài)常量在函數(shù)執(zhí)行后不會釋放其存儲空間;
1.2 static
static 表示的是靜態(tài)的
-
類的靜態(tài)成員函數(shù)、靜態(tài)成員變量是和類相關(guān)的,而不是和類的具體對象相關(guān)的。即使沒有具體對象,也能調(diào)用類的靜態(tài)成員函數(shù)和成員變量。一般類的靜態(tài)函數(shù)幾乎就是一個(gè)全局函數(shù),只不過它的作用域限于包含它的文件中。
-
在 C++ 中,static 靜態(tài)成員變量不能在類的內(nèi)部初始化。在類的內(nèi)部只是聲明,定義必須在類定義體的外部,通常在類的實(shí)現(xiàn)文件中初始化。
-
static 關(guān)鍵字只能用于類定義體內(nèi)部的聲明中,定義時(shí)不能標(biāo)示為 static。
-
在 C++ 中,const 成員變量也不能在類定義處初始化,只能通過構(gòu)造函數(shù)初始化列表進(jìn)行,并且必須有構(gòu)造函數(shù)。
-
const 數(shù)據(jù)成員只在某個(gè)對象生存期內(nèi)是常量,而對于整個(gè)類而言卻是可變的。因?yàn)轭惪梢詣?chuàng)建多個(gè)對象,不同的對象其 const 數(shù)據(jù)成員的值可以不同。所以不能在類的聲明中初始化 const 數(shù)據(jù)成員,因?yàn)轭惖膶ο鬀]被創(chuàng)建時(shí),編譯器不知道 const 數(shù)據(jù)成員的值是什么。
-
const 數(shù)據(jù)成員的初始化只能在類的構(gòu)造函數(shù)的初始化列表中進(jìn)行。要想建立在整個(gè)類中都恒定的常量,應(yīng)該用類中的枚舉常量來實(shí)現(xiàn),或者static const。
class Test{
public:
Test():a(0){}
enum {size1=100,size2=200};
private:
const int a; // 只能在構(gòu)造函數(shù)初始化列表中初始化
static int b; // 在類的實(shí)現(xiàn)文件中定義并初始化
const static int c; // 與 static const int c;相同。
};
int Test::b=0; // static成員變量不能在構(gòu)造函數(shù)初始化列表中初始化,因?yàn)樗粚儆谀硞€(gè)對象。
const int Test::c=0; // 注意:給靜態(tài)成員變量賦值時(shí),不需要加static修飾符,但要加cosnt。
-
const 成員函數(shù)主要目的是防止成員函數(shù)修改對象的內(nèi)容。即 const 成員函數(shù)不能修改成員變量的值,但可以訪問成員變量。當(dāng)訪問成員函數(shù)時(shí),該函數(shù)只能是 const 成員函數(shù)。
-
static 成員函數(shù)主要目的是作為類作用域的全局函數(shù)。不能訪問類的非靜態(tài)數(shù)據(jù)成員。類的靜態(tài)成員函數(shù)沒有 this 指針,這導(dǎo)致:
-
不能直接存取類的非靜態(tài)成員變量,調(diào)用非靜態(tài)成員函數(shù)。
-
不能被聲明為 virtual。
-
1.3 關(guān)于 static、const、static const、const static 成員的初始化問題
類里的const成員初始化:
在一個(gè)類里建立一個(gè) const 時(shí),不能給他初值。
class foo{
public:
foo():i(100){}
private:
const int i = 100;//error!!!
};
//或者通過這樣的方式來進(jìn)行初始化
foo::foo():i(100){}
1.3.2 類里的static成員初始化
類中的 static 變量是屬于類的,不屬于某個(gè)對象,它在整個(gè)程序的運(yùn)行過程中只有一個(gè)副本,因此不能在定義對象時(shí) 對變量進(jìn)行初始化,就是不能用構(gòu)造函數(shù)進(jìn)行初始化,其正確的初始化方法是:
數(shù)據(jù)類型 類名::靜態(tài)數(shù)據(jù)成員名 = 值;
class foo{
public:
foo();
private:
static int i;
};
int foo()::i=20;
-
初始化在類體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?/strong>
-
初始化時(shí)不加該成員的訪問權(quán)限控制符private、public等。
-
初始化時(shí)使用作用域運(yùn)算符來表明它所屬的類,因此,靜態(tài)數(shù)據(jù)成員是類的成員而不是對象的成員。
1.3.3 類里的 static const 和 const static 成員初始化
class Test{
public:
static const int mask1;
const static int mask2;
};
const Test::mask1 = 0xffff;
const Test::mask2 = 0xffff;
// 它們的初始化沒有區(qū)別,雖然一個(gè)是靜態(tài)常量一個(gè)是常量靜態(tài)。靜態(tài)都將存儲在全局變量區(qū)域,其實(shí)最后結(jié)果都一樣??赡茉诓煌幾g器內(nèi),不同處理,但最后結(jié)果都一樣。
完整實(shí)例
#ifdef A_H_
#define A_H_
#include <iostream>
using namespace std;
class A{
public:
A(int a);
staticvoid print(); // 靜態(tài)成員函數(shù)
private:
static int aa; // 靜態(tài)數(shù)據(jù)成員的聲明
staticconst int count; // 常量靜態(tài)數(shù)據(jù)成員(可以在構(gòu)造函數(shù)中初始化)
const int bb; // 常量數(shù)據(jù)成員
};
int A::aa=0; // 靜態(tài)成員的定義+初始化
const int A::count=25; // 靜態(tài)常量成員定義+初始化
A::A(int a):bb(a){ // 常量成員的初始化
aa+=1;
}
void A::print(){
cout<<"count="<<count<<endl;
cout<<"aa="<<aa<<endl;
}
#endif
int main(){
A a(10);
A::print();//通過類訪問靜態(tài)成員函數(shù)
a.print();//通過對象訪問靜態(tài)成員函數(shù)
}
2. c++類的靜態(tài)成員
2.1 靜態(tài)數(shù)據(jù)成員
-
在類中,靜態(tài)成員可以實(shí)現(xiàn)多個(gè)對象之間的數(shù)據(jù)共享,并且使用靜態(tài)數(shù)據(jù)成員還不會破壞隱藏的原則,即保證了安全性。因此,靜態(tài)成員是類的所有對象中共享的成員,而不是某個(gè)對象的成員。
-
使用靜態(tài)數(shù)據(jù)成員可以節(jié)省內(nèi)存,因?yàn)樗撬袑ο笏械?/strong>,因此,對多個(gè)對象來說,靜態(tài)數(shù)據(jù)成員只存儲一處,供所有對象共用。靜態(tài)數(shù)據(jù)成員的值對每個(gè)對象都是一樣,但它的值是可以更新的。只要對靜態(tài)數(shù)據(jù)成員的值更新一次,保證所有對象存取更新后的相同的值,這樣可以提高時(shí)間效率。
靜態(tài)數(shù)據(jù)成員的使用方法和注意事項(xiàng)如下:
-
靜態(tài)數(shù)據(jù)成員在定義或說明時(shí)前面加關(guān)鍵字 static。
-
靜態(tài)成員初始化與一般數(shù)據(jù)成員初始化不同。
靜態(tài)數(shù)據(jù)成員初始化的格式如下:
<數(shù)據(jù)類型> <類名>::<靜態(tài)數(shù)據(jù)成員名> = <值>
注意:
- **初始化在類體外進(jìn)行,而前面不加static,**以免與一般靜態(tài)變量或?qū)ο笙嗷煜?/li>
- 初始化時(shí)不加該成員的訪問權(quán)限控制符private,public等。
- 初始化時(shí)使用作用域運(yùn)算符來標(biāo)明它所屬類,因此,靜態(tài)數(shù)據(jù)成員是類的成員,而不是對象的成員。
2.2 靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)和靜態(tài)數(shù)據(jù)成員一樣,它們都屬于類的靜態(tài)成員,它們都不是對象成員。因此,對靜態(tài)成員的引用不需要用對象名。
在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,可以引用類中說明的靜態(tài)成員。如果靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時(shí),可通過對象來引用。
#include …
class M{
public:
M(int a){
A=a;
B+=a;
}
static void f1(M m);
private:
int A;
static int B;
};
void M::f1(M m)
{
cout<<"A="<<m.A<<endl;
cout<<"B="<<B<<endl;
}
int M::B=0;
int main()
{
M P(5),Q(10);
M::f1(P); //調(diào)用時(shí)不用對象名
M::f1(Q);
}
調(diào)用靜態(tài)成員函數(shù)使用如下格式:
<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>);
3. C++ 中各種類型的成員變量的初始化方法
C++各種不同類型成員根據(jù)是否static、時(shí)候const類型的初始化方法不盡相同。
#pragma once
class Test
{
private:
int var1;
// int var1 = 4; 錯(cuò)誤的初始化方法
const int var2 ;
// const int var2 =2; 錯(cuò)誤的初始化方法
static int var3;
// static int var3 = 3; 錯(cuò)誤,只有靜態(tài)常量int成員才能直接賦值來初始化
static const int var4 = 4; //正確,靜態(tài)常量成員可以直接初始化
static const int var5;//也可以在類外初始化,可以被const
public:
Test(void);
~Test(void);
};
int Test::var3 = 3; //靜態(tài)成員的正確的初始化方法
// int Test::var1 = 1; 錯(cuò)誤靜態(tài)成員才能初始化
// int Test::var2 = 2; 錯(cuò)誤
// int Test::var4 = 4; // 錯(cuò)誤的方法,提示重定義
Test::Test(void):var1(1),var2(2) // 正確的初始化方法,var3(3)不能在這里初始化
{
var1 = 1; //正確, 普通變量也可以在這里初始化
// var2 = 2; 錯(cuò)誤,因?yàn)槌A坎荒苜x值,只能在 "constructor initializer (構(gòu)造函數(shù)的初始化列表)" 那里初始化
var3 = 4; //這個(gè)賦值是正確的,不過因?yàn)樗袑ο笠粋€(gè)靜態(tài)成員,所以會影響到其他的,這不能叫做初始化了吧
}
Test::~Test(void){}
有些成員變量的數(shù)據(jù)類型比較特別,它們的初始化方式也和普通數(shù)據(jù)類型的成員變量有所不同。這些特殊的類型的成員變量包括:文章來源:http://www.zghlxwxcb.cn/news/detail-799762.html
- a. 常量型成員變量
- b. 引用型成員變量
- c. 靜態(tài)成員變量
- d. 整型靜態(tài)常量成員變量
- e. 非整型靜態(tài)常量成員變量
對于常量型成員變量和引用型成員變量的初始化,必須通過構(gòu)造函數(shù)初始化列表的方式進(jìn)行。在構(gòu)造函數(shù)體內(nèi)給常量型成員變量和引用型成員變量賦值的方式是行不通的。文章來源地址http://www.zghlxwxcb.cn/news/detail-799762.html
到了這里,關(guān)于17. C++ static、const 和 static const 類型成員變量聲明以及初始化的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!