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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++类成员的初始化

發布時間:2025/3/15 c/c++ 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++类成员的初始化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分類: c/c++進行時 14697人閱讀 評論(7) 收藏 舉報 c++stringinitializationclass編譯器面試

1、關于構造函數

1)用構造函數確保初始化

對于一個空類

[cpp] view plaincopy
  • class?Empty?{?};??
  • 編譯器會自動聲明4個默認函數:構造函數,拷貝構造函數,賦值函數,析構函數(當然,如果不想使用自動生成的函數,就應該明確拒絕),這些生成的函數都是public且inline。構造函數對數據成員進行初始化,使用未初始化值可能導致無法預知的錯誤,所以,確保每一個構造函數都將每一個成員初始化。

    2)為什么構造函數不能有返回值

    如果有返回值,要么編譯器必須知道怎么處理返回值,要么就客戶程序員顯式調用構造函數和析構函數,這樣,還有安全性么?

    3)為什么構造函數不能為虛函數

    簡單來說,虛函數調用的機制,是知道接口而不知道其準確對象類型的函數,但是創建一個對象,必須知道對象的準確類型;當一個構造函數被調用時,它做的首要事情之一就是初始化它的VPTR來指向VTABLE。

    4)構造函數的一個面試題:

    [cpp] view plaincopy
  • #include?<iostream>??
  • using?namespace?std;??
  • ??
  • class?Base???
  • {??
  • private:??
  • ????int?i;??
  • public:??
  • ????Base(int?x)??
  • ????{??
  • ????????i?=?x;??
  • ????}??
  • };??
  • ??
  • class?Derived?:?public?Base??
  • {??
  • private:??
  • ????int?i;??
  • public:??
  • ????Derived(int?x,?int?y)??
  • ????{??
  • ????????i?=?x;??
  • ????}??
  • ????void?print()??
  • ????{??
  • ????????cout?<<?i?+?Base::i?<<?endl;??
  • ????}??
  • };??
  • ??
  • int?main()??
  • {??
  • ????Derived?A(2,3);??
  • ????A.print();??
  • ????return?0;??
  • }??
  • 首先,是訪問權限問題,子類中直接訪問Base::i是不允許的,應該將父類的改為protected或者public(最好用protected)

    其次,統計父類和子類i的和,但是通過子類構造函數沒有對父類變量進行初始化;此處編譯會找不到構造函數,因為子類調用構造函數會先找父類構造函數,但是沒有2個參數的,所以可以在初始化列表中調用父類構造函數

    最后個問題,是單參數的構造函數,可能存在隱式轉換的問題,因為單參數構造函數,和拷貝構造函數形式類似,調用時很可能會發生隱式轉換,應加上explicit關鍵字,修改后如下(程序員面試寶典上只改了前2個)

    [cpp] view plaincopy
  • #include?<iostream>??
  • using?namespace?std;??
  • ??
  • class?Base???
  • {??
  • protected:??
  • ????int?i;??
  • public:??
  • ????explicit?Base(int?x)??
  • ????{??
  • ????????i?=?x;??
  • ????}??
  • };??
  • ??
  • class?Derived?:?public?Base??
  • {??
  • private:??
  • ????int?i;??
  • public:??
  • ????Derived(int?x,?int?y):Base(x)??
  • ????{??
  • ????????i?=?y;??
  • ????}??
  • ????void?print()??
  • ????{??
  • ????????cout?<<?i?+?Base::i?<<?endl;??
  • ????}??
  • };??
  • ??
  • int?main()??
  • {??
  • ????Derived?A(2,3);??
  • ????A.print();??
  • ????return?0;??
  • }??
  • 2、初始化列表

    1)使用初始化列表提高效率

    常用的初始化可能如下:

    [cpp] view plaincopy
  • class?Student???
  • {??
  • public:??
  • ????Student(string?in_name,?int?in_age)??
  • ????{??
  • ????????name?=?in_name;??
  • ????????age?=?in_age;??
  • ????}??
  • private?:??
  • ????string?name;??
  • ????int????age;??
  • };??
  • ? ? 以前樓主也習慣這么寫,可以達到預期效果,不過不是最佳做法,因為在構造函數中,是對name進行賦值,不是初始化,而string對象會先調用它的默認構造函數,再調用string類(貌似是basic_string類)的賦值構造函數;對于上例的age,因為int是內置類型,應該是賦值的時候獲得了初值。

    ? ? 要對成員進行初始化,而不是賦值,可以采用初始化列表(member initialization list)改寫為如下:

    [cpp] view plaincopy
  • class?Student???
  • {??
  • public:??
  • ????Student(string?in_name,?int?in_age):name(in_name),age(in_age)?{}??
  • private?:??
  • ????string?name;??
  • ????int????age;??
  • };??
  • ? ? 結果與上例相同,不過在初始化的時候調用的是string的拷貝構造函數,而上例會調用兩次構造函數,從性能上會有不小提升

    ? ? 有的情況下,是必須使用初始化列表進行初始化的:const對象、引用對象

    2)初始化列表初始順序

    考慮以下代碼:

    [cpp] view plaincopy
  • #include?<iostream>??
  • using?namespace?std;??
  • ??
  • class?Base???
  • {??
  • public:??
  • ????Base(int?i)?:?m_j(i),?m_i(m_j)?{}??
  • ????Base()?:?m_j(0),?m_i(m_j)?{}??
  • ????int?get_i()?const??
  • ????{??
  • ????????return?m_i;??
  • ????}??
  • ????int?get_j()?const??
  • ????{??
  • ????????return?m_j;??
  • ????}??
  • ??
  • private:??
  • ????int?m_i;??
  • ????int?m_j;??
  • ??
  • };??
  • ??
  • int?main()??
  • {??
  • ????Base?obj(98);??
  • ????cout?<<?obj.get_i()?<<?endl?<<?obj.get_j()?<<?endl;??
  • ????return?0;??
  • }??
  • ? ? ?
    輸出為一個隨機數和98,為什么呢?因為對于初始化列表而言,對成員變量的初始化,是嚴格按照聲明次序,而不是在初始化列表中的順序進行初始化,如果改為賦值初始化則不會出現這個問題,當然,為了使用初始化列表,還是嚴格注意聲明順序吧,比如先聲明數組大小,再聲明數組這樣。


    總結完畢,望有用

    總結

    以上是生活随笔為你收集整理的C++类成员的初始化的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。