1. 程式人生 > >c++建構函式中初始化列表的作用和機制

c++建構函式中初始化列表的作用和機制

#include <iostream>
#include <string>

using namespace std;

class base
{
private:
	int m_i;
	int m_j;
public:
	base(int i): m_j(i), m_i(m_j){}//這裡改變順序
	base():m_j(0),m_i(m_j){}
	int get_i()
	{
		return m_i;
	}
	int get_j()
	{
		return m_j;
	}
};
class A
{
	static const int size=0;//靜態,常量,整型才可以直接初始化。其他都不可以。
};

int main(int argc, char* argv)
{
	base obj(98);
	cout<<obj.get_i()<<endl<<obj.get_j()<<endl;
	base nn;
	cout<<nn.get_i()<<endl<<nn.get_j()<<endl;

	A nb;

	return 0;
}

這裡就有一個有趣的問題,雖然m_j出現在m_i前面,但m_i在m_j前面定義,所以先初始化m_i,此時m_j還是隨機數,所以m_i就被初始化為一個隨機數。

相關推薦

c++建構函式初始列表作用機制

#include <iostream> #include <string> using namespace std; class base { private: int m_i; int m_j; public: base(int i): m_j(i), m_i(m_j){}

C++ 建構函式初始列表

在C++中,一個簡單的建構函式可以如下所示: class X { private: int i_; int j_; public: X(int i, int j) { i_ = i; j

c++建構函式成員初始賦值初始列表兩種方式的區別

先總結下: 由於類成員初始化總在建構函式執行之前 1)從必要性:      a. 成員是類或結構,且建構函式帶引數:成員初始化時無法呼叫預設(無參)建構函式      b. 成員是常量或引用:成員無法賦值,只能被初始化 2)從效率上:     如果在類建構函式裡賦值:在成員

C++:建構函式初始列表,以及初始的順序

建構函式的初始化值列表: 對於物件的資料成員而言,初始化和賦值是有區別的。 當資料成員是 const 、引用,或者屬於某種未提供預設建構函式的類型別的話,就必須通過建構函式的初始值列表為這些成員提供初始值,否則就會引發錯誤。 // 錯誤:ci 和 ri 必須初始化 CobstRef::C

C++類的學習,規範命名,建構函式初始列表

1. 規範命名 在使用類(class)寫程式時有以下規範 成員變數的命名 //m代表member,同時標清成員的型別和具體名稱 int m_iAge; string m_strName

建構函式 引數初始列表

建立類物件時會自動呼叫建構函式 建構函式不需且不能手動呼叫 預設建構函式:在建立物件時不必給出實參的建構函式。包括無參建構函式和全部引數都有預設值的建構函式。 如果使用者沒有定義建構函

c++ 建構函式explicit關鍵字的作用

C++ explicit關鍵字的作用主要是用來修飾類的建構函式,表明該建構函式是顯式的,禁止單引數建構函式的隱式轉換。 如果C++類的建構函式有一個引數,那麼在編譯的時候就會有一個預設的轉換操作:將該建構函式對應資料型別的資料轉換為該類物件,如下面所示:class MyCl

c++初始列表建構函式初始

初始化和賦值對內建型別的成員沒有什麼的的區別,在成員初始化列表和建構函式體內進行,在效能和結果上都是一樣的。對非內建型別成員變數,因為類型別的資料成員的資料成員物件在進入函式體前已經構造完成,也就是說在成員初始化列表處進行構造物件的工作,呼叫建構函式,在進入函式體之後,進行的是對已經構造好的類物件的賦值,又呼

c++初始列表初始變量順序問題

bsp 變量 結果 請問 iostream 類的成員 sin vat 並不是 例題來看:請問下面程序打印出的結果是什麽? 1 #include <iostream> 2 #include <string> 3 4 using namesp

提高C#程式設計水平的50個要點 之十三“使用靜態建構函式初始靜態成員變數”

  編寫程式的時候難免要使用到靜態成員,由於靜態成員的訪問是脫離型別物件的,所以使用非靜態建構函式,私有方法或者一些其他方法進行靜態變數的初始化都是不合理的。   .net提供了成員初始化語句和靜態建

Java類的靜態屬性、靜態程式碼塊塊、非靜態屬性、非靜態程式碼塊塊、建構函式初始時的執行順序

序言   前幾天在複習J2SE的時候,看到了這個Java類在new的過程中,靜態域、靜態塊、非靜態域、非靜態塊、建構函式的執行順序問題。就想著自己總結寫一下,便於以後查閱總結:    以下是我整理好的結果;在java類new一個物件的過程中,它們的執行順序如下:     (當

建構函式初始初始列表還是大括號裡好,那種效率高

complex (double r = 0, double i = 0): re (r), im (i){}: re (r), im (i)  初始化列表   放在大括號中實現  re和im的初始化  也可,只是效率差

c#建構函式的thisbase

首先要明確: this指向的本例項的建構函式,base指向的時基類的建構函式。 再執行順序上,a、this表明,在執行本建構函式之前,先執行this指向本例項的建構函式,再執行本函式。          

C++建構函式呼叫虛擬函式是否有多型的效果

C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;

C++解析(12):初始列表與物件構造順序

0.目錄 1.類成員的初始化 2.類中的const成員 3.物件的構造順序 3.1 區域性物件的構造順序 3.2 堆物件的構造順序 3.3 全域性物件的構造順序 4.小結 1.類成員的初始化 類中是否可以定義const成員? 下面的類定義是否合法?如果合法,ci的值是什麼,儲

C++建構函式呼叫虛擬函式

談談關於建構函式中呼叫虛擬函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。 測試平臺:VS2013 + Win7X64 一個例子: #include <stdlib.h> #i

建構函式引數初始的順序

下面列出總結: 1.成員變數在使用初始化列表初始化時,與建構函式中初始化成員列表的順序無關,只與定義成員變數的順序有關。就是(通常是private下)定義變數的先後順序。所以一般建構函式的初始化列表和定義順序相同。 2.如果不使用初始化列表初始化,在建構函式內初始化時,無

C++建構函式丟擲異常

建構函式中丟擲異常會有怎樣的影響呢?如下實驗程式碼 #include <iostream> #include <stdexcept> using namespace std; class A { public: A(int n){} ~A(){cout

C++ 建構函式呼叫虛擬函式

我們知道:C++中的多型使得可以根據物件的真實型別(動態型別)呼叫不同的虛擬函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛擬函式,會怎麼樣呢? 有這麼一段程式碼: class A { public: A ():m_iVal(0){test();}

C++建構函式丟擲的異常

建構函式中丟擲的異常   1、標準C++中定義建構函式是一個物件構建自己,分配所需資源的地 方,一旦建構函式執行完畢,則表明這個物件已經誕生了,有自己的行為和內部的執行狀態,之後還有物件的消亡過程(解構函式的執行)。可誰能保證物件的構造 過程一定能成功呢?說不定系統當前的某