日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

必须使用初始化列表的情况

發(fā)布時(shí)間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 必须使用初始化列表的情况 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在學(xué)習(xí)c++時(shí),一直對(duì)必須使用初始化列表的情況說(shuō)不全,或者說(shuō)不清楚。今天來(lái)總結(jié)學(xué)習(xí)一下。先回憶一下,必須使用初始化列表的情況
1.類數(shù)據(jù)成員為const類型2. 類數(shù)據(jù)成員為引用類型3.類沒(méi)有默認(rèn)的拷貝構(gòu)造4. 派生類的構(gòu)造函數(shù)初始化列表必須調(diào)用基類的構(gòu)造函數(shù)
  • const 數(shù)據(jù)成員
  • class test
  • {
  • public:
  • test()
  • {
  • cout << "constructor with argument\n";
  • }
  • private:
  • const int i=10;
  • };
  • 結(jié)果編譯錯(cuò)誤:
    原因:因?yàn)槌A繑?shù)據(jù)成員必須進(jìn)行初始化,而不能被賦值。函數(shù)體內(nèi)只能進(jìn)行賦值,因此初始化列表是const數(shù)據(jù)成員初始化的唯一機(jī)會(huì)。明確了兩點(diǎn):
  • 只有靜態(tài)常量成員才可以在類中初始化,如果沒(méi)有在類內(nèi)、類外初始化。則其會(huì)被初始化為0 或者 “空”(NULL或者string(“”))
  • 非靜態(tài)常量成員必須在初始化列表中完成
  • 再需要注意的就是static成員可以在類中聲明為任何的格式,但是數(shù)據(jù)成員定義必須在類的外部定義。與普通的數(shù)據(jù)成員不同,static成員不通過(guò)類構(gòu)造函數(shù)進(jìn)行初始化,而是應(yīng)該在定義時(shí)進(jìn)行初始化。
    • 引用類型的數(shù)據(jù)成員
    ?因?yàn)橐檬且粋€(gè)對(duì)象的別名,因此必須進(jìn)行初始化。而函數(shù)內(nèi)部為初始化,不為賦值。因此初始化列表是其初始化的唯一機(jī)會(huì)。
  • class test
  • {
  • public:
  • test()
  • {
  • cout << "constructor with argument\n";
  • cout << i <<endl;
  • }
  • private:
  • int& i;
  • //static int j;
  • 這里如果沒(méi)有給出初始化列表,編譯失敗。

    編譯器提示,i必須在構(gòu)造函數(shù)初始值列表中初始化。
    筆者在此做了一個(gè)有趣的測(cè)試,如果將引用類型改為靜態(tài)的數(shù)據(jù)成員,那么還需要進(jìn)行初始化列表嗎?
  • class test
  • {
  • public:
  • test()
  • {
  • cout << "constructor with argument\n";
  • cout << i <<endl;
  • }
  • private:
  • static int& i;
  • static int j;
  • };
  • int test::j = 10;
  • int& test::i = j;
  • 結(jié)果可以看出,如果成員類型為靜態(tài)的引用類型,則應(yīng)該按照靜態(tài)數(shù)據(jù)成員對(duì)待。需要在類定義體外進(jìn)行定義并初始化。
    • 如果類沒(méi)有默認(rèn)構(gòu)造函數(shù)
    • class Base
    • {
    • public:
    • Base(int a) : val(a) {}
    • private:
    • int val;
    • };
    • class A
    • {
    • public:
    • A(int v) : p(v), b(v) {}
    • void print_val() { cout << "hello:" << p << endl;}
    • private:
    • int p;
    • Base b;
    • };

    因?yàn)楫?dāng)類數(shù)據(jù)成員沒(méi)有默認(rèn)的構(gòu)造函數(shù)時(shí),在另一個(gè)類中聲明了該變量(Base)。如果不用初始化列表構(gòu)造,則其編譯失敗,因?yàn)槠錄](méi)有參數(shù),無(wú)法進(jìn)行構(gòu)造。
    • 如果存在繼承關(guān)系,派生類中必須在其初始化列表中調(diào)用基類的構(gòu)造函數(shù)
    在看effective C++的時(shí)候,其中有一條 復(fù)制對(duì)象時(shí)勿忘其每一個(gè)成分 ?Copying函數(shù)應(yīng)該確保復(fù)制“對(duì)象內(nèi)的所有成員變量” 及“所有base成分”
  • class Base
  • {
  • public:
  • Base(int a) : val(a) {}
  • private:
  • int val;
  • };
  • class A : public Base
  • {
  • public:
  • A(int v) : p(v), Base(v) {}
  • void print_val() { cout << "hello:" << p << endl;}
  • private:
  • int p;
  • };
  • 再看一個(gè)例子,關(guān)于Copy函數(shù)應(yīng)注意的地方
  • class Base
  • {
  • public:
  • Base(int j):i(j)
  • {
  • cout << "constructor with argument\n";
  • int p = 20;
  • i = p;
  • cout << i <<endl;
  • }
  • private:
  • int i;
  • };
  • class Derive: public Base
  • {
  • public:
  • Derive(int i ):Base(i),_i(i)
  • {
  • }
  • Derive(const Derive &d):Base(d),_i(d._i)
  • {
  • }
  • Derive& operator=(const Derive& d)
  • {
  • Base::operator=(d);
  • _i = d._i;
  • return *this;
  • }
  • private:
  • int _i;
  • };
  • 在這個(gè)例子中我們可以看到,派生類中的拷貝構(gòu)造函數(shù)對(duì)的初始化列表調(diào)用了基類構(gòu)造函數(shù)進(jìn)行初始化。在賦值構(gòu)造函數(shù)中也調(diào)用了基類的賦值構(gòu)造函數(shù)對(duì)基類部分進(jìn)行構(gòu)造。

    來(lái)自為知筆記(Wiz)

    轉(zhuǎn)載于:https://www.cnblogs.com/chengkeke/p/5417352.html

    總結(jié)

    以上是生活随笔為你收集整理的必须使用初始化列表的情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。