C++成員變量的初始化順序問題

先來看兩道題:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A {
public:A() { cout << "in A()" << endl; }
};class B {
public:B() { cout << "in B()" << endl; }B(int i) { cout << "in B(int i)" << endl; }
};class C {
public:C() { cout << "in C()" << endl; }
};class CC : public C {
public:CC() :b(10) { cout << "in CC()" << endl; }
public:A a;B b;
};int main()
{CC c;return 0;
}

答案:

in C()
in A()
in B(int i)
in CC()
請按任意鍵繼續. . .

再看另一道題:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A
{
private:int n1;int n2;public:A() :n2(0), n1(n2 + 2){}void Print(){cout << "n1:" << n1 << ", n2: " << n2 << endl;}
};int main()
{A a;a.Print();return 1;
}

答案:

n1:-858993458, n2: 0
請按任意鍵繼續. . .

若改成:

// count algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::count
#include <vector>       // std::vector
using namespace std;
class A
{
private:int n1;int n2;public:A() {n2 = 0;n1 = n2 + 2;}void Print(){cout << "n1:" << n1 << ", n2: " << n2 << endl;}
};int main()
{A a;a.Print();return 1;
}


答案:

n1:2, n2: 0
請按任意鍵繼續. . .


上面的例子告訴了我們一個事實:

類的初始化順序:基類--->成員------->構造函數內部

具體是:

1.先給基類分配內存

2.按照定義的先后順序初始化列表

3.進入類構造函數后執行構造函數內部的代碼

而且類成員變量的初始化順序以成員在類中的聲明為序, 而不管它在初始化成員列表的出現順勢。

?因此:

我們看第一個例子:

CC繼承自C,因此先調用C的構造函數,輸出“in C()

然后CC中含有A,B兩個成員類,按照先后次序,分別初始化,調用A,B的構造函數,由于B有參數傳遞,所以調用顯式構造函數:

in A()
in B(int i)
最后執行CC構造函數內部的代碼

in CC()

第二個例子:

int n1;
int n2;public:A() :n2(0), n1(n2 + 2){}
定義時,規定了n1在前,n2在后,所以在初始化時亦執行此順序。故出現:

n1:-858993458, n2: 0

后面做了改造,則直接執行函數內部的代碼,按照順序,所以結果:

n1:2, n2: 0







本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259205.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259205.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Knockout.Js案例一Introduction

在這第一個教程中,您將體驗的一些基本知識構建的web UI Model-View-ViewModel使用knockout.js(MVVM)模式。案例1&#xff1a;添加:data-bind <p>First name: <strong data-bind"text:firstName">1</strong></p><p>Last name: <stro…

C#注冊表常用操作

1&#xff1a;加鍵 改值 Microsoft.Win32.RegistryKey Key Microsoft.Win32.Registry.CurrentUser.CreateSubKey( "Software\Microsoft\Internet Explorer\Main"); Key.SetValue( "Window Title" , value ); Key.Close(); …

谷歌瀏覽器外貿版_做外貿快兩個月,沒有單怎么辦?

Hello 大家好&#xff0c;我是Jack。今天給大家更新一篇在知乎看到的外貿問題&#xff1a;做外貿快兩個月&#xff0c;沒有單怎么辦?外貿這個話題在知乎算是小眾話題了&#xff0c;相比較于職場&#xff0c;英語學習&#xff0c;國際政治&#xff0c;IT等&#xff0c;這些話題…

React Native通信機制詳解

http://blog.cnbang.net/tech/2698/ React Native是facebook剛開源的框架&#xff0c;可以用javascript直接開發原生APP&#xff0c;先不說這個框架后續是否能得到大眾認可&#xff0c;單從源碼來說&#xff0c;這個框架源碼里有非常多的設計思想和實現方式值得學習&#xff0c…

C++11系列學習之四----auto

在哪些情況下要申明類型&#xff1a; 定義變量類型 函數返回值&#xff0c;函數參數 表達式返回變量類型 auto關鍵字原理 在定義變量的時候必須申明類型&#xff0c;c是強語言類型&#xff0c;在編譯階段需要知道類型&#xff0c;這樣的好處是程序效率更高&#xff0c;而…

windows 自動copy遠程服務器文件

net use h: \\123.45.67.000\T1dbbackup 123456/user:administrator ------遠程服務器IP123.45.67.000 。T1dbbackup&#xff1a;共享文件夾 。 h :映射到本機的盤符。 用戶名&#xff1a;administrator&#xff0c;密碼&#xff1a;123456copy h:\*.* f:\T1DB ------復…

eclipse 不能切換輸入法

按了AltShift鍵&#xff1f;再按一次把EN切換成CN&#xff0c;然后再CtrlShift就可以切換輸入法轉載于:https://www.cnblogs.com/jiayonghua/p/3413827.html

excel打開2個獨立窗口_謝楠稱女性獨立的不是錢是心 謝楠與吳京婚后生育2個兒子...

近日&#xff0c;在綜藝節目《幸福三重奏》 三日談妻子篇中&#xff0c;謝楠被問到如何看待獨立女性時&#xff0c;反問記者會不會問吳京同樣的問題&#xff1b;隨后回答道&#xff0c;女性獨立的不是錢&#xff0c;而是你的心&#xff1b;楠姐的回答超級霸氣了&#xff0c;你們…

C++11系列學習之五-------decltype

使用場景 在C中經常要用到很長的變量名&#xff0c;如果已經有變量和你將使用的變量是一個類型&#xff0c;即可使用decltype關鍵字 來申明一樣的類型變量。 decltype原理 返回現有變量類型&#xff0c;decltype是一個關鍵字&#xff0c;而不是一個函數&#xff0c;這有啥區別…

Linux學習 Unit 9

Unit9.openssh-server1.openssh-server功能&#xff1a;讓遠程主機可以通過網絡訪問sshd服務&#xff0c;開始一個安全shell2.客戶端連接方式ssh遠程主機用戶遠程主機ip[rootdesktop0 ~]# ssh root172.25.0.11The authenticity of host 172.25.0.11 (172.25.0.11) cant be esta…

2015年創業中遇到的技術問題:41-50

41.Bootstrap換行。col-md-10和col-md-2。這2個div按說應該在一行的&#xff0c;結果col-md-2換行了。看看樣式&#xff0c;發現有多余的“margin-left: 1px;"。42.Service實現類定義了一個“自動調度進行刷新”的方法。OverrideScheduled(cron "0 0/10 * * * ? &q…

KMP模板與講解

讀書筆記終于寫完了&#xff0c;寫一下我對KMP的理解。 KMP的思想就是盡量利用已經得到的信息&#xff0c;來降低時間復雜度&#xff0c;已經得到的信息存放在next數組里。算法確實很難理解&#xff0c;所以很難講解。。舉個例子來說吧。 設字符串是str[]&#xff0c;next[5] …

android 非root app 捕捉系統廣播_APP的生死之道

這篇文章主要介紹APP在安卓系統中是怎么被殺死的&#xff0c;按照怎樣的一個策略去釋放進程&#xff1b;同時介紹一些延長應用存活時間的方案&#xff0c;雖然這個在現在安卓系統上越來越難實現了&#xff0c;但是也是可以稍微了解下&#xff0c;主要也是通過這些hack的方案更好…

C++11系列學習之六-----for

前言C11這次的更新帶來了令很多C程序員期待已久的for range循環&#xff0c;每次看到javascript&#xff0c; lua里的for range&#xff0c;心想要是C能有多好&#xff0c;心里別提多酸了。這次C11不負眾望&#xff0c;再也不用羨慕別家人的for range了。使用場景ex1&#xff1…

ArcGIS Engine 10開發環境的一些常見問題(轉載)

轉自&#xff1a;http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid107612&extra&page1 許多版友在剛剛使用ArcGIS 10做開發的時候&#xff0c;都會遇到這樣那樣的問題。在擔任實習版主的這一個多月里&#xff0c;看到了這么幾個與開發環境相關的問題&#xff0c;重…

@value 靜態變量_面試官:為什么靜態方法不能調用非靜態方法和變量?

這個可能很多人之前學習jvm的時候都會遇到&#xff0c;屬于一個小問題&#xff0c;寫這篇文章的原因是我在看java相關的面試題目中遇到的&#xff0c;因此順手總結一下&#xff1a;一、例子我們先看效果&#xff1a;我們在靜態方法main中調用非靜態變量或者是方法都會報錯。我們…

SpringMVC連接多數據源配置

在spring-config-datasource.xml中配置&#xff1a; <ds:ibatis-config><ds:sql-map-clientid"sqlMapClient2"datasource-ref"riskBasicDataSource2"config-location"classpath:sqlmap-config.xml"/> </ds:ibatis-config> <…

Memcached 工作原理

http://hzp.iteye.com/blog/1872664Memcached處理的原子是每一個&#xff08;key&#xff0c;value&#xff09;對&#xff08;以下簡稱kv對&#xff09;&#xff0c;key會通過一個hash算法轉化成hash-key&#xff0c;便于查找、對比以及做到盡可能的散列。同時&#xff0c;mem…

C++11系列學習之七---------初始化列表

一、前言C的學習中&#xff0c;我想每個人都被變量定義和申明折磨過&#xff0c;比如我在大學筆試過的幾家公司&#xff0c;都考察了const和變量&#xff0c;類型的不同排列組合&#xff0c;讓你區別有啥不同。反正在學習C過程中已經被折磨慣了&#xff0c;今天再來看看重溫下那…

c# streamReader轉XmlDocument讀取節點

http獲得web&#xff08;url&#xff09;請求&#xff0c;先是獲得數據流streamreader&#xff0c;之后將String數據流轉換為xmldocument&#xff0c;之后xmlnode讀取節點。 // get the responseWebResponse webResponse webRequest.GetResponse();if (webResponse null){ re…