C++:建構函式的初始化列表,以及初始化的順序
建構函式的初始化值列表:
對於物件的資料成員而言,初始化和賦值是有區別的。
當資料成員是 const 、引用,或者屬於某種未提供預設建構函式的類型別的話,就必須通過建構函式的初始值列表為這些成員提供初始值,否則就會引發錯誤。
// 錯誤:ci 和 ri 必須初始化
CobstRef::ConstRef(int ii)
{// 賦值
i = ii;
ci = ii;
ri = i;
}
//正確
ConstRef::ConstRef(int ii):i(ii),ci(ii),ri(i){}
在類中,初始化是直接初始化資料成員,而賦值實際上是先初始化、再賦值。所以賦值的效率比較低。
更重要的是,一些資料成員是必須要被初始化的。
所以建議大家養成使用初始值列表的習慣。
成員初始化的順序:
成員初始化的順序和它們在類定義中出現的順序一致,建構函式初始值列表中的前後位置不會影響實際的初始化順序。
相關推薦
C++:建構函式的初始化列表,以及初始化的順序
建構函式的初始化值列表: 對於物件的資料成員而言,初始化和賦值是有區別的。 當資料成員是 const 、引用,或者屬於某種未提供預設建構函式的類型別的話,就必須通過建構函式的初始值列表為這些成員提供初始值,否則就會引發錯誤。 // 錯誤:ci 和 ri 必須初始化 CobstRef::C
C++:建構函式2——拷貝建構函式
前言:拷貝建構函式是C++中的重點之一,在這裡對其知識進行一個簡單的總結。 一、什麼是拷貝建構函式 在C++中,對於內建型別的變數來說,在其建立的過程中用同類型的另一個變數來初始化它是完全可以的,如: 1 int value=100; 2 int new_value=value;//在變
C++類建構函式為什麼要使用初始化列表?
class Class { int a; double b; string s; void execute(); }; \\第一種寫法 Class::Class(){ a = 0; b = 1.0; s = "stirng"; } \\第二種寫法 Class::Clas
C++類建構函式初始化列表
建構函式初始化列表以一個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟一個放在括號中的初始化式。例如: class CExample { public: int a; float b;
C++建構函式中用引數列表初始化成員
C++建構函式中初始化成員引數列表初始化成員(必須用的原因:物件成員的初始化,const修飾的成員的初始化,引用成員的初始化,子類呼叫父類的建構函式初始化父類成員)引數列表在建構函式執行之前執行,引數列表中執行的是初始化(所有的成員,無論是否出現在引數列表中,都
為什麼對於類的const成員,只能使用初始化列表,而不能在建構函式內部進行賦值操作
結論:對於類的const成員,只能使用初始化列表,而不能在建構函式內部進行賦值操作。原因如下:1、建構函式不能被宣告為const函式,因此當我們建立一個類的const物件時,直到建構函式完成初始化的過程,物件才真正取得其“常量”的屬性,因此,建構函式在const物件的構造過程
在C++拷貝建構函式中使用初始化列表
今天同事遇到一個關於拷貝建構函式的問題。程式碼大致如下: class test { public: test( size_t size ) { v.assign( size, 1 ); } test( const test& rhs)
C++類建構函式和初始化列表
建構函式初始化列表以一個冒號開始,接著是以逗號分隔的資料成員列表,每個資料成員後面跟一個放在括號中的初始化式。例如: class CExample {public: int a; float b; //建構函式初始化列表 CExample(): a(0),b(8.8) {}
C++中建構函式初始化列表為什麼會比建構函式中賦值要高效
Test { Test(test& t1) { this->t=t1; } private: test t; } 相信很多人跟我一樣,非常困惑為什麼Test構造時會先呼叫test的建構函式,再呼叫test類的賦值操作符。那是因為賦值操作符不能產生新的物件,Te
C/C++—— 在建構函式中呼叫虛擬函式能實現多型嗎(Vptr指標初始化的過程分析)
問題引入: 比如:如果我們想在父類的建構函式中呼叫虛擬函式,當定義子類物件的時候,父類的建構函式中的虛擬函式執行的是子類中的函式。 在下面的例子中,定義子類物件的時候,在父類建構函式中的print虛擬函式執行的不是子類中的print函式,而是父類中的prin
java執行過程,初始化的順序,建構函式,變數作用域,反射機制,面向物件的特徵
java是解釋性語言 執行過程:程式原始碼經過java編譯器編譯成位元組碼,然後由JVM解釋執行。 Java源程式經過編譯器編譯後變成位元組碼,位元組碼由虛擬機器解釋執行,虛擬機器將每一條要執行的位元組碼送給直譯器,直譯器將其翻譯成特定機器上的機器碼,然後在特定的機器上執
使用建構函式直接賦值與使用初始化列表的不同
在C++中,對於成員變數的初始化主要有兩種方式: 1. 直接在建構函式中進行賦值 2. 使用建構函式初始化列表進行賦值 雖然在現代編譯器中,這兩種初始化方式幾乎沒有效能上的差異,但是需要知道的是,這兩種初始化操作實際上是不同的。 通過建構函式直接進行初始化,對於自定義型別的
C++第十週【任務2】定義一個名為CPerson的類,有以下私有成員:姓名、身份證號、性別和年齡,成員函式:建構函式、解構函式、輸出資訊的函式。
/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱: C++第十週【任務2】 * 作
C++語言特性:建構函式,解構函式,虛擬函式,行內函數,靜態成員函式,過載,覆蓋,隱藏
C++中class預設屬性為private, struct預設屬性為public 建構函式: 1.初始化物件成員; 2.建立類物件; 由於虛擬函式是建立在物件的基礎上的,因此建構函式不能宣告為虛擬函式;虛擬函式是在執行的時候才識別,
java中靜態初始化塊,例項初始化塊,建構函式區別
public class People { public static int num=0;//靜態變數 String name; static//靜態初始化塊 { System.out.println(num+":靜態初始化
c++中建構函式初始化的方法以及主要區別
一、我的問題是關於初始化C++類成員的。我見過許多這樣的程式碼: CSomeClass::CSomeClass() { x=0; y=1; } 而在別的什麼地方則寫成下面的樣子: CSomeClass::CSomeClass() : x(0), y(1) { } 我的一些程式設計師朋友說第
提高C++效能的程式設計技術筆記:建構函式和解構函式+測試程式碼
物件的建立和銷燬往往會造成效能的損失。在繼承層次中,物件的建立將引起其先輩的建立。物件的銷燬也是如此。其次,物件相關的開銷與物件本身的派生鏈的長度和複雜性相關。所建立的物件(以及其後銷燬的物件)的數量與派生的複雜度成正比。 並不是說繼承根本上就是程式碼效能的絆腳石。我們必須區分全部計算開銷、
C++知識點10:建構函式和解構函式
建構函式: 生成物件時呼叫建構函式 生成派生類物件時先呼叫基類建構函式在呼叫派生類建構函式 #include <iostream> using namespace std; class base { public: base(){
C/C++面試題:建構函式與解構函式
建構函式與解構函式的一道小題 下面程式的輸出是什麼? #include<iostream> using namespace std; class TestClass{ cha
C++:Main函式引數列表及引數型別轉換
有三個問題待解決: 1、C/C++ main函式引數意義 2、怎麼向main函式傳參 3、傳進來的引數型別是什麼?怎麼型別轉換? 下面來分別分析! 首先,看程式碼,然後分析。 int main(in