0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C++之初始化列表學(xué)習(xí)的總結(jié)

電子設(shè)計(jì) ? 來源:電子設(shè)計(jì) ? 作者:電子設(shè)計(jì) ? 2020-12-24 17:39 ? 次閱讀

大家好,本次給大家分享的內(nèi)容是C++里面的初始化列表運(yùn)用,希望對(duì)大家有幫助。

一、引出列表的使用:

1、在介紹列表之前,我們先來看看使用const關(guān)鍵字來修飾類中的成員會(huì)有什么事情發(fā)生,下面是一段簡(jiǎn)單代碼:

#include <stdio.h>
class Test{
private:
const int a;
public
int getA()

return a;

};
int main()

return 0;

編譯:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++#

從編譯結(jié)果來看,沒毛病,完全和正常修飾一個(gè)成員一樣;為了要顯示這里的細(xì)節(jié)問題,我們來創(chuàng)建一個(gè)對(duì)象,進(jìn)而調(diào)用類里面的方法來獲取成員a的值:

#include <stdio.h>
class Test{
private:
const int a;
public:
int getA()

return a;

};
int main()

Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;

編譯:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp:3:7: error: uninitialized const member in ‘class Test’
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;

通過編譯我們發(fā)現(xiàn)他報(bào)了一個(gè)錯(cuò)誤,說成員a沒有進(jìn)行初始化;那么沒有初始化,我們就給成員a一個(gè)值來進(jìn)行初始化:

#include <stdio.h>
class Test{
private:
const int a;
public:
Test()

a=666;

int getA()

return a;

};
int main()

Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;

我們是用了無(wú)參構(gòu)造函數(shù)對(duì)a進(jìn)行初始化(private里面的成員不能直接初始化,被保護(hù)住了,這個(gè)知識(shí)是基本常識(shí)哈),下面編譯看看,會(huì)有啥現(xiàn)象發(fā)生:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
test.cpp: In constructor ‘Test::Test()’:
test.cpp:7:6: error: uninitialized const member in ‘const int’ [-fpermissive]
Test()
^~~~
test.cpp:5:16: note: ‘const int Test::a’ should be initialized
const int a;

test.cpp:9:11: error: assignment of read-only member ‘Test::a’
a=666;

和沒有const關(guān)鍵字修飾的成員還不一樣,上面說a還是要初始化,也就是我們?cè)跇?gòu)造函數(shù)體里面對(duì)a進(jìn)行進(jìn)行初始賦值是行不通的哦,那該如何解決解決這個(gè)問題呢?答案來了,就是我們的初始化列表。

二、初始化列表“閃亮登場(chǎng)”:

1、首先我們先來看一下初始haul列表的書寫格式:

ClassName::ClassName:
m1(v1),m2(v1,v2),m3(v3)


從上面我們可以發(fā)現(xiàn),初始化列表就是在構(gòu)造函數(shù)名稱后面且在構(gòu)造函數(shù)體之間。同時(shí)這里我們也要注意初始化列表的使用原則:

(1)成員的初始化順序與成員的聲明順序相同。

(2)成員的初始化順序與初始化列表中的位置無(wú)關(guān)。

(3)初始化列表優(yōu)先于構(gòu)造函數(shù)的函數(shù)體執(zhí)行。

我們接著上面那個(gè)初始的問題,現(xiàn)在我們使用初始化列表來看看啥情況:

#include <stdio.h>
class Test{
private:
const int a;
public:
Test():a(666)

// a=666;

int getA()

return a;

};
int main()

Test t;
printf("the t.a(chǎn) is %d",t.getA());
return 0;

編譯:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ls
a.out test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the t.a(chǎn) is 666

問題被完美解決,是不是心里很開心哈。接下來我們繼續(xù)舉一個(gè)上面規(guī)則里面說的初始化順序問題:

#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)

printf("the c is %d",c);
b=c;

int getB()

return b;

};
class Test{
private:
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3)

printf("TXP ");

};
int main()

Test t;
return 0;

編譯:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP

從上面的輸出結(jié)果我們可以初始化的順序與成員的聲明順序有關(guān),同時(shí)他也先于構(gòu)造函數(shù)體的執(zhí)行。

三、類中的const成員:

現(xiàn)在我們來總結(jié)一下在類中使用const關(guān)鍵字來修飾類中的屬性時(shí),這時(shí)的屬性有啥特征:

(1)類中的const成員會(huì)被分配空間的。

(2)類中的const成員的本質(zhì)是只讀變量。

(3)類中的const成員只能再初始化列表中指定初始值

(4)編譯器無(wú)法直接得到const成員的初始值,因此無(wú)法進(jìn)入到符號(hào)表成為真正意義上的常量(也就是說這里的只讀變量,我們還是可以通過一定的手段來改變其值的大小。)

下面我們來看一個(gè)例子:

#include <stdio.h>
class Value{
private:
int b;
public:
Value(int c)

printf("the c is %d",c);
b=c;

int getB()

return b;

};
class Test{
private:
const int f;
Value d1;
Value d2;
Value d3;
public:
Test():d2(2),d1(1),d3(3),f(888)

printf("TXP");

int getF()

return f;

int setF(int i)

int *p = const_cast<int*>(&f);
*p = i;

};
int main()

Test t;
printf("the f is %d",t.getF());
t.setF(666);
printf("the f is %d",t.getF());

編譯:

root@txp-virtual-machine:/home/txp/c++# g++ test.cpp
root@txp-virtual-machine:/home/txp/c++# ./a.out
the c is 1
the c is 2
the c is 3
TXP
the f is 888
the f is 666

通過上面的例子,我們的結(jié)論都得到了一一驗(yàn)證。

四、總結(jié):

(1)類中可以使用初始化列表對(duì)成員進(jìn)行初始化。

(2)初始化列表先于構(gòu)造函數(shù)體執(zhí)行。

(3)類中可以定義const成員變量。

(4)const成員變量必須在初始化列表中指定初值。

(5)const成員變量只為只讀變量。

以上就是本次的學(xué)習(xí)分享。純屬個(gè)人學(xué)習(xí)c++的成長(zhǎng)之旅。

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 可編程邏輯
    +關(guān)注

    關(guān)注

    7

    文章

    514

    瀏覽量

    44037
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73404
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Keil中變量不被初始化方法

    有些時(shí)候在我們的應(yīng)用過程中要求變量有連續(xù)性,或者現(xiàn)場(chǎng)保留,例如Bootloader跳轉(zhuǎn),某種原因的復(fù)位過程中我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個(gè)操作做總結(jié),分別
    的頭像 發(fā)表于 08-30 11:47 ?361次閱讀
    Keil中變量不被<b class='flag-5'>初始化</b>方法

    初始化IO口為外部中斷線的時(shí)候,最先初始化的會(huì)被后初始化的覆蓋掉為什么?

    初始化IO口為外部中斷線的時(shí)候,比如GPIOA6與GPIOB6先后初始化為外部中斷,最先初始化的會(huì)被后初始化的覆蓋掉,不知道是為什么?
    發(fā)表于 05-14 08:26

    字符型、指針型等變量等該如何初始化

     對(duì)于數(shù)值類型的變量往往初始化為0,但對(duì)于其他類型的變量,如字符型、指針型等變量等該如何初始化呢?
    的頭像 發(fā)表于 03-18 11:02 ?1093次閱讀

    MCU單片機(jī)GPIO初始化該按什么順序配置?為什么初始化時(shí)有電平跳變?

    GPIO初始化時(shí)有時(shí)鐘配置、模式配置、輸出配置、復(fù)用配置,那么在編寫初始化代碼時(shí),到底該按什么順序執(zhí)行呢?如果順序不當(dāng)那初始化過程可能會(huì)出現(xiàn)短暫的電平跳變。
    的頭像 發(fā)表于 02-22 11:07 ?1303次閱讀
    MCU單片機(jī)GPIO<b class='flag-5'>初始化</b>該按什么順序配置?為什么<b class='flag-5'>初始化</b>時(shí)有電平跳變?

    串口初始化一般是初始化哪些內(nèi)容

    串口初始化是指在使用串口進(jìn)行數(shù)據(jù)通信之前,對(duì)串口進(jìn)行一系列的設(shè)置和配置,以確保串口能夠正常工作。串口初始化的內(nèi)容主要包括以下幾個(gè)方面: 串口硬件設(shè)置:首先,需要確定要使用的串口是哪一個(gè),通常計(jì)算機(jī)
    的頭像 發(fā)表于 01-04 09:39 ?2869次閱讀

    labview運(yùn)行后如何初始化

    LabVIEW是一款強(qiáng)大的圖形編程軟件,在運(yùn)行之前通常需要進(jìn)行一些初始化操作。本文將詳細(xì)介紹LabVIEW運(yùn)行前的初始化過程,并提供了一些常用的初始化方法。 創(chuàng)建新項(xiàng)目: 在LabV
    的頭像 發(fā)表于 12-28 17:24 ?2260次閱讀

    自動(dòng)初始化機(jī)制原理詳解

    自動(dòng)初始化機(jī)制是指初始化函數(shù)不需要被顯式調(diào)用,只需要在函數(shù)定義處通過宏定義的方式進(jìn)行申明,就會(huì)在系統(tǒng)啟動(dòng)過程中被執(zhí)行。這篇文章就來探索一下其中的奧秘, 簡(jiǎn)單理解其原理!
    的頭像 發(fā)表于 12-16 09:33 ?917次閱讀
    自動(dòng)<b class='flag-5'>初始化</b>機(jī)制原理詳解

    C語(yǔ)言編程時(shí),各種類型的變量該如何初始化?

    C語(yǔ)言編程時(shí),各種類型的變量該如何初始化? 在C語(yǔ)言中,每個(gè)變量都需要在使用之前進(jìn)行初始化初始化是為變量分配內(nèi)存空間并賦予
    的頭像 發(fā)表于 12-07 13:53 ?1049次閱讀

    secondary cpu初始化狀態(tài)設(shè)置

    ,用于填寫secondary cpu的入口地址。 uboot負(fù)責(zé)將這塊內(nèi)存的地址寫入devicetree中,當(dāng)內(nèi)核初始化完成,需要啟動(dòng)secondary cpu時(shí),就將其內(nèi)核入口地址寫到那塊內(nèi)存中
    的頭像 發(fā)表于 12-05 15:27 ?907次閱讀
    secondary cpu<b class='flag-5'>初始化</b>狀態(tài)設(shè)置

    在ubuntu20.04中如何初始化rosdep

    初始化rosdep 輸入以下的命令,先對(duì)其初始化一下 sudo rosdep init 如果出現(xiàn)以下界面,那么恭喜你,你可以省下一些麻煩了,直接跳到第7步就行了: 如果出現(xiàn)了以下幾種錯(cuò)誤,也不要擔(dān)心
    的頭像 發(fā)表于 12-01 16:22 ?788次閱讀
    在ubuntu20.04中如何<b class='flag-5'>初始化</b>rosdep

    C語(yǔ)言中的數(shù)組格式與初始化

    多少存儲(chǔ)空間。 數(shù)組格式與初始化 ????格式: ? 元素類型 數(shù)組名[元素個(gè)數(shù)]; ? ?????比如: ? int[3]; ? ????數(shù)組元素有順序之分,每個(gè)元素都有一個(gè)唯一的下標(biāo)(索引),而且都是從0開始。 ????數(shù)組中第i個(gè)元素的訪問方式:? ? a[i] ? ????數(shù)組元
    的頭像 發(fā)表于 11-26 16:12 ?705次閱讀
    <b class='flag-5'>C</b>語(yǔ)言中的數(shù)組格式與<b class='flag-5'>初始化</b>

    實(shí)戰(zhàn)經(jīng)驗(yàn) | Keil、IAR、CubeIDE 中變量不被初始化方法

    程中要求變量有連續(xù)性,或者現(xiàn)場(chǎng)保留,例如 Bootloader 跳轉(zhuǎn),某種原因的復(fù)位過程中我們有些關(guān)鍵變量不能被初始化,在不同的編譯環(huán)境下有不同的設(shè)置,本文就這個(gè)操作做總結(jié),分別介紹使用 Keil
    的頭像 發(fā)表于 11-24 18:05 ?3513次閱讀

    MSP430F5529硬件IIC驅(qū)動(dòng)OLED(初始化使用的寄存器)

    MSP430F5529硬件IIC驅(qū)動(dòng)OLED(初始化使用的寄存器)
    發(fā)表于 11-24 16:36 ?1次下載

    C/C++語(yǔ)言學(xué)習(xí)大全套

    電子發(fā)燒友網(wǎng)站提供《C/C++語(yǔ)言學(xué)習(xí)大全套.rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:33 ?2次下載
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>語(yǔ)言<b class='flag-5'>學(xué)習(xí)</b>大全套

    EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)C#開發(fā)(二):EtherCAT總線初始化

    本文主要講解EtherCAT總線初始化、驅(qū)動(dòng)器IO映射以及軸運(yùn)動(dòng)調(diào)試。
    的頭像 發(fā)表于 11-17 09:24 ?590次閱讀
    EtherCAT超高速實(shí)時(shí)運(yùn)動(dòng)控制卡XPCIE1032H上位機(jī)<b class='flag-5'>C</b>#開發(fā)(二):EtherCAT總線<b class='flag-5'>初始化</b>