国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

17. C++ static、const 和 static const 類型成員變量聲明以及初始化

這篇具有很好參考價(jià)值的文章主要介紹了17. C++ static、const 和 static const 類型成員變量聲明以及初始化。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

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ù)類型的成員變量有所不同。這些特殊的類型的成員變量包括:

  • 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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C++:初始化列表,static成員,友元,內(nèi)部類

    C++:初始化列表,static成員,友元,內(nèi)部類

    個(gè)人主頁 : 個(gè)人主頁 個(gè)人專欄 : 《數(shù)據(jù)結(jié)構(gòu)》 《C語言》《C++》 本篇博客作為C++:初始化列表,static成員,友元,內(nèi)部類的知識總結(jié)。 初始化列表:以冒號開始,接著是一個(gè)以逗號分隔的數(shù)據(jù)成員列表,每個(gè)“成員變量”后面跟一個(gè)放在括號中的初始值或表達(dá)式。 初始化

    2024年02月07日
    瀏覽(29)
  • C++——初始化列表 | explicit關(guān)鍵字 | static成員

    C++——初始化列表 | explicit關(guān)鍵字 | static成員

    ??作者簡介: 花想云 ,在讀本科生一枚,致力于 C/C++、Linux 學(xué)習(xí)。 ?? 本文收錄于 C++系列 ,本專欄主要內(nèi)容為 C++ 初階、C++ 進(jìn)階、STL 詳解等,專為大學(xué)生打造全套 C++ 學(xué)習(xí)教程,持續(xù)更新! ?? 相關(guān)專欄推薦: C語言初階系列 、 C語言進(jìn)階系列 、 數(shù)據(jù)結(jié)構(gòu)與算法 本章我們

    2023年04月11日
    瀏覽(22)
  • 【C++】初始化列表、static成員、友元、匿名對象、附練習(xí)題

    【C++】初始化列表、static成員、友元、匿名對象、附練習(xí)題

    我們前面學(xué)習(xí)了關(guān)于類和對象的6個(gè)默認(rèn)成員函數(shù),知道了一個(gè)空類中有構(gòu)造函數(shù)和析構(gòu)函數(shù),通過對對象初始化和對象中進(jìn)行資源清理,達(dá)到初始化和銷毀的作用。我們再對一些小的點(diǎn)進(jìn)行補(bǔ)充,看看類和對象的一些細(xì)節(jié)。 1.1 構(gòu)造函數(shù)體賦值 在創(chuàng)建對象時(shí),編譯器通過 調(diào)

    2024年02月22日
    瀏覽(20)
  • 【C++初階】六、類和對象(初始化列表、static成員、友元、內(nèi)部類)

    【C++初階】六、類和對象(初始化列表、static成員、友元、內(nèi)部類)

    ========================================================================= 相關(guān)代碼gitee自取 : C語言學(xué)習(xí)日記: 加油努力 (gitee.com) ?========================================================================= 接上期 : 【C++初階】五、類和對象 (日期類的完善、流運(yùn)算符重載函數(shù)、const成員、“”取地址運(yùn)算符重

    2024年02月05日
    瀏覽(31)
  • 【036】讀懂C++的強(qiáng)制類型轉(zhuǎn)換static_cast、const_cast、dynamic_cast以及reinterpret_cast

    【036】讀懂C++的強(qiáng)制類型轉(zhuǎn)換static_cast、const_cast、dynamic_cast以及reinterpret_cast

    ?? 作者簡介:專注于C/C++高性能程序設(shè)計(jì)和開發(fā),理論與代碼實(shí)踐結(jié)合,讓世界沒有難學(xué)的技術(shù)。包括C/C++、Linux、MySQL、Redis、TCP/IP、協(xié)程、網(wǎng)絡(luò)編程等。 ?? ??? CSDN實(shí)力新星,社區(qū)專家博主 ?? ?? 專欄介紹:從零到c++精通的學(xué)習(xí)之路。內(nèi)容包括C++基礎(chǔ)編程、中級編程、

    2024年02月12日
    瀏覽(18)
  • 【C++入門到精通】C++入門 —— 類和對象(初始化列表、Static成員、友元、內(nèi)部類、匿名對象)

    【C++入門到精通】C++入門 —— 類和對象(初始化列表、Static成員、友元、內(nèi)部類、匿名對象)

    目錄 一、初始化列表 ?初始化列表概念 ?初始化列表的優(yōu)點(diǎn) ?使用場景 ?explicit 二、Static成員 ?Static成員概念 ??靜態(tài)數(shù)據(jù)成員: ??靜態(tài)函數(shù)成員: ?使用靜態(tài)成員的優(yōu)點(diǎn) ?使用靜態(tài)成員的注意事項(xiàng) 三、友元 ?友元的概念 ?類友元 ?函數(shù)友元 ?四、內(nèi)部類 ?

    2024年02月14日
    瀏覽(16)
  • 【C++干貨基地】面向?qū)ο蠛诵母拍?const成員函數(shù) | 初始化列表 | explicit關(guān)鍵字 | 取地址重載

    【C++干貨基地】面向?qū)ο蠛诵母拍?const成員函數(shù) | 初始化列表 | explicit關(guān)鍵字 | 取地址重載

    ?? 鴿芷咕 :個(gè)人主頁 ??? 個(gè)人專欄 : 《C++干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! ??哈嘍各位鐵汁們好啊,我是博主鴿芷咕《C++干貨基地》是由我的襄陽家鄉(xiāng)零食基地有感而發(fā),不知道各位的城市有沒有這種實(shí)惠又全面的零食基地呢?C++ 本身作

    2024年04月23日
    瀏覽(21)
  • [C++]類與對象(下) -- 初始化列表 -- static成員 -- 友元 -- 內(nèi)部類,一篇帶你深度了解。

    [C++]類與對象(下) -- 初始化列表 -- static成員 -- 友元 -- 內(nèi)部類,一篇帶你深度了解。

    ? 目錄 1、再談構(gòu)造函數(shù) 1.1 構(gòu)造函數(shù)體賦值 1.2 初始化列表 1.2.1 初始化列表的意義 1.3 explicit 2、static成員 2.1 問題引入 2.2 特性 3、友元 3.1 友元函數(shù) 3.2 友元類 4、內(nèi)部類 在創(chuàng)建對象時(shí),編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個(gè)成員變量一個(gè)合適的初始值。 我們構(gòu)造函

    2024年02月12日
    瀏覽(23)
  • 【C++練級之路】【Lv.4】類和對象(下)(初始化列表,友元,static成員,編譯器的優(yōu)化)

    【C++練級之路】【Lv.4】類和對象(下)(初始化列表,友元,static成員,編譯器的優(yōu)化)

    歡迎各位小伙伴關(guān)注我的專欄,和我一起系統(tǒng)學(xué)習(xí)C++,共同探討和進(jìn)步哦! 學(xué)習(xí)專欄 : 《進(jìn)擊的C++》 在創(chuàng)建對象時(shí),編譯器通過調(diào)用構(gòu)造函數(shù),給對象中各個(gè)成員變量一個(gè)合適的初始值。 雖然上述構(gòu)造函數(shù)調(diào)用之后,對象中已經(jīng)有了一個(gè)初始值,但是不能將其稱為對對象

    2024年02月04日
    瀏覽(27)
  • 【JavaScript】JavaScript 變量 ① ( JavaScript 變量概念 | 變量聲明 | 變量類型 | 變量初始化 | ES6 簡介 )

    【JavaScript】JavaScript 變量 ① ( JavaScript 變量概念 | 變量聲明 | 變量類型 | 變量初始化 | ES6 簡介 )

    JavaScript 變量 是用于 存儲數(shù)據(jù) 的 容器 , 通過 變量名稱 , 可以 獲取 / 修改 變量 中的數(shù)據(jù) ; 變量 的 本質(zhì) 是 存放數(shù)據(jù) 的 一塊內(nèi)存空間 ; 在 JavaScript 中, 使用 var / let / const 來聲明變量 , 每個(gè)變量都有一個(gè) 變量名 和 一個(gè) 變量值 ; JavaScript 變量聲明 : var : 使用

    2024年03月15日
    瀏覽(32)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包