最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++類成員初始化的三種方式

 更新時間:2021年09月27日 15:19:14   作者:我是一顆大西瓜  
如果靜態(tài)成員不滿足常量性,則不可以就地聲明,而且即使常量的靜態(tài)成員也只能是整型或者枚舉型才能就地初始化。而非靜態(tài)成員變量的初始化則必須在構(gòu)造函數(shù)中進(jìn)行。首先,先得了解一下C++支持哪幾種類成員初始化的方式,下面我們就來看看具體內(nèi)容吧

前言:

在C++98中,支持了在類聲明中使用等號“=”加初始值的方式,來初始化類中靜態(tài)成員常量。這種聲明方式我們也稱之為“就地”聲明。就地聲明在代碼編寫時非常便利,不過C++98對類中就地聲明的要求卻非常高。如果靜態(tài)成員不滿足常量性,則不可以就地聲明,而且即使常量的靜態(tài)成員也只能是整型或者枚舉型才能就地初始化。而非靜態(tài)成員變量的初始化則必須在構(gòu)造函數(shù)中進(jìn)行。

首先,先得了解一下C++支持哪幾種類成員初始化的方式,你常用的又是哪一種。

一、初始化方式

1、初始化方式一:初始化列表

class A
{
public:
    int a; // 初始化列表
    A(int a_):a(a_){}
};

2、初始化方式二:構(gòu)造函數(shù)初始化

class A
{
public:
    int a; // 初始化列表
    A(int a_, bool b) { a = a_; }
};

3、初始化方式三:聲明時初始化(也稱就地初始化,c++11后支持)

class A
{
public:
    int a = 1; // 聲明時初始化
    A() {}
};

在C++98中,支持了在類聲明中使用等號“=”加初始值的方式,來初始化類中靜態(tài)成員常量。這種聲明方式我們也稱之為“就地”聲明。就地聲明在代碼編寫時非常便利,不過C++98對類中就地聲明的要求卻非常高。如果靜態(tài)成員不滿足常量性,則不可以就地聲明,而且即使常量的靜態(tài)成員也只能是整型或者枚舉型才能就地初始化。而非靜態(tài)成員變量的初始化則必須在構(gòu)造函數(shù)中進(jìn)行。比如,如下代碼在c++98中編譯

class Init
{
public:
    Init(): a(0) []
    Init(int d): a(d) {}
private:
    int a;
    const static int b = 0;

    int c = 1;           // member, cannot pass build
    static int d = 0;    // member, cannot pass build

    static const double e = 1.3;      // not int or enum type, cannot pass build
    stati const char* const f = "e";  // not int or enum type, cannot pass build
}

這非常不方便,所以在C++11中,標(biāo)準(zhǔn)允許非靜態(tài)成員變量的初始化有多種形式。具體而言,除了初始化列表外,在C++11中,標(biāo)準(zhǔn)還允許使用等號= 或者 花括號{} 進(jìn)行就地的非靜態(tài)成員變量初始化。

struct init {
    int a = 1;
    double b {1.2};
};

大家知道,有幾種情況下推薦優(yōu)先使用列表初始化

  • const成員變量只能用成員初始化列表來完成初始化,而不能在構(gòu)造函數(shù)內(nèi)賦值
  • 初始化的數(shù)據(jù)成員是對象
  • 需要初始化引用成員數(shù)據(jù)

具體的原因這里不細(xì)述,大家可以去看一下《C++ Primer》。

構(gòu)造函數(shù)初始化的本質(zhì)是賦值操作("="),這個方法存在兩個問題,一個是比起初始化列表和就地初始化,此方式的效率偏低;第二個是可能存在錯誤隱患

先說第一個,賦值過程中會產(chǎn)生臨時對象,臨時對象的構(gòu)造析構(gòu)會造成效率損耗,初始化列表的方式就避免了產(chǎn)生臨時對象縮帶來的問題。

第二個是,如果你沒有重寫或者禁止賦值構(gòu)造函數(shù),c++會悄悄的加上默認(rèn)的賦值構(gòu)造函數(shù),這個時候也有可能帶來問題。

從C++11之后,這三種初始化的方法都可以使用,并不會存在沖突,但是,他們之間是有優(yōu)先級順序的,這個優(yōu)先級來源于他們在初始化的時間順序,后面初始化的會把前面的覆蓋掉,成員變量的初始化順序是

二、聲明時初始化->初始化列表->構(gòu)造函數(shù)初始化

因此假如三種初始化方式同時存在的話,那么最后保留的成員變量值肯定是構(gòu)造函數(shù)中初始化的值。

#include <iostream>
using namespace std;
class A 
{
public:
    int a = 1;
    A(int a_) :a(2) { a = 3; }
};

int main()
{
    A a;
    cout << "a.a=" << a.a << endl;
    return 0;
}

// a.a=3

既然初始化方式這么多,那么什么時候適用哪種呢?

1、聲明時初始化的使用場景

一個優(yōu)點(diǎn)是直觀,你在聲明的時候順便給一個初始值,bravo,別人在看你代碼的時候,點(diǎn)一下調(diào)到聲明也能看到你賦予的初始值,不用再去看構(gòu)造函數(shù)那里給的什么值
第二個優(yōu)點(diǎn)更有用了,比如你要定義多個構(gòu)造函數(shù),每個構(gòu)造函數(shù)都用列表初始化的方法初始化,多麻煩呀,請看下面的例子,媽媽看了再也不用擔(dān)心我想用其他初始化方法了

class Group {
public:
    Group() {}
    Group(int a): data(a) {}
    Group(Mem m): mem(m) {}
    Group(int a, Mem m, string n): data(a), mem(m), name(n) {}
private:
    int data = 1;
    Mem mem{0};
    string name{"Group"};
};

2、列表初始化的使用場景

前面說過了三個場景,這里贅述一下

  • const成員變量只能用成員初始化列表來完成初始化,而不能在構(gòu)造函數(shù)內(nèi)賦值
  • 初始化的數(shù)據(jù)成員是對象
  • 需要初始化引用成員數(shù)據(jù)

但是,需要注意列表初始化的順序,不過IDE會提示你的

3、構(gòu)造函數(shù)初始化的使用場景

第一個就是拷貝和賦值構(gòu)造函數(shù)里(不然怎么叫賦值構(gòu)造函數(shù)呢)
第二個就是比較無聊的情況了,比如你想把幾個成員函數(shù)都初始化成一個值,請看下面例子

class Group {
public:
    Group() {data1 = data2 = data3 = 0;}
private:
    int data1;
    int data2;
    int data3;
};

一言以蔽之,優(yōu)先就地初始化和列表初始化。

到此這篇關(guān)于C++類成員初始化的三種方式的文章就介紹到這了,更多相關(guān)C++類成員初始化的方式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實現(xiàn)三子棋游戲詳細(xì)介紹(附代碼)

    C++實現(xiàn)三子棋游戲詳細(xì)介紹(附代碼)

    大家好,本篇文章主要講的是C++實現(xiàn)三子棋游戲詳細(xì)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • 基于C++中setiosflags()的用法詳解

    基于C++中setiosflags()的用法詳解

    下面小編就為大家?guī)硪黄贑++中setiosflags()的用法詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • c++帶有string的結(jié)構(gòu)體賦值和清零問題

    c++帶有string的結(jié)構(gòu)體賦值和清零問題

    這篇文章主要介紹了c++帶有string的結(jié)構(gòu)體賦值和清零問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • c++ STL常用遍歷算法

    c++ STL常用遍歷算法

    這篇文章主要介紹了c++ STL常用遍歷算法的實現(xiàn),幫助大家更好的理解和使用c++,感興趣的朋友可以了解下
    2020-12-12
  • Windows消息傳遞機(jī)制詳解

    Windows消息傳遞機(jī)制詳解

    這篇文章主要介紹了Windows消息傳遞機(jī)制,有助于讀者更好的理解windows編程的消息機(jī)制,需要的朋友可以參考下
    2014-07-07
  • C語言如何在字符數(shù)組中插入一個字符

    C語言如何在字符數(shù)組中插入一個字符

    這篇文章主要介紹了C語言如何在字符數(shù)組中插入一個字符,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 重學(xué)c/c++之?dāng)?shù)據(jù)存儲詳解(整數(shù)、浮點(diǎn)數(shù))

    重學(xué)c/c++之?dāng)?shù)據(jù)存儲詳解(整數(shù)、浮點(diǎn)數(shù))

    C語言給定了一些基本的數(shù)據(jù)類型,下面這篇文章主要給大家介紹了關(guān)于重學(xué)c/c++之?dāng)?shù)據(jù)存儲(整數(shù)、浮點(diǎn)數(shù))的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • 詳解C++ sizeof(下)

    詳解C++ sizeof(下)

    這篇文章主要介紹了C++ sizeof的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C語言如何讀取bmp圖像

    C語言如何讀取bmp圖像

    這篇文章主要介紹了C語言如何讀取bmp圖像,BMP即bitmap,由文件頭信息塊、圖像描述信息塊、顏色表、圖像數(shù)據(jù)區(qū)四部分組成,下文更多相關(guān)資料需要的小伙伴可以參考一下
    2022-04-04
  • 關(guān)于大小端、位域的一些概念詳解

    關(guān)于大小端、位域的一些概念詳解

    我們常用的x86結(jié)構(gòu)都是小端模式,而大部分DSP,ARM也是小端模式,不過有些ARM是可以選擇大小端模式。所以對于上面的maxHeight是應(yīng)該以小端模式來存放,具體情況請看下面兩表
    2013-10-10

最新評論

休宁县| 太谷县| 香格里拉县| 肇东市| 会理县| 合阳县| 大厂| 南昌市| 汤阴县| 丹巴县| 潍坊市| 大厂| 宁强县| 鹤山市| 惠州市| 文昌市| 朔州市| 贵定县| 乌鲁木齐县| 永泰县| 水城县| 阳城县| 宝清县| 石阡县| 漾濞| 宣恩县| 出国| 调兵山市| 巴南区| 迁安市| 平罗县| 营山县| 忻城县| 平顺县| 保山市| 伊宁市| 榆社县| 田阳县| 织金县| 呼玛县| 安西县|