1. 程式人生 > >C++中必須在初始化列表初始化的型別

C++中必須在初始化列表初始化的型別

1.賦值是刪除原值,賦予新值,建構函式的意思是先開闢空間然後為其賦值,只能算是賦值,不算初始化;初始化列表開闢空間與初始化是同時完成的,直接給予一個值。 2. C++中常量是不能被賦值的,只能被初始化,所以const型別必須在初始化列表中完成; 3. 引用必須在定義的時候初始化,並且不能賦新值,所以引用型別也必須要在初始化列表初始化。 4. 沒有預設建構函式的類型別,因為使用初始化列表可以不必呼叫預設建構函式來初始化,而是直接呼叫拷貝建構函式初始化。 例題: class A{ ... private:     int a; public:     const int b;     float* &c;     static const char* d;     static double* e; }; 上述型別中必須在初始化列表初始化的是b和c; 解疑:d是const型別,為什麼d不是必須在初始化列表初始化呢,因為d是static const型別,因為static屬於類,不屬於具體的物件,所以static成員是不允許在類內進行初始化的,它在未例項化時就已經存在了,而建構函式的初始化列表,只有在例項化時才執行。

相關推薦

C++必須用參數列表初始的4種情況

c/c++在C++中,必須使用構造函的參數列表來初始化成員變量的4種情況如下:(1)成員變量類型為 const int m_nData;class test { private: const int m_nData; public: test():m_nData(120){} };(2)

C++必須初始列表初始型別

1.賦值是刪除原值,賦予新值,建構函式的意思是先開闢空間然後為其賦值,只能算是賦值,不算初始化;初始化列表開闢空間與初始化是同時完成的,直接給予一個值。 2. C++中常量是不能被賦值的,只能被初始化,所以const型別必須在初始化列表中完成; 3. 引用必須在定義的時候初

C#使用匿名類和初始

程式碼如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespa

C++建構函式中用引數列表初始成員

C++建構函式中初始化成員引數列表初始化成員(必須用的原因:物件成員的初始化,const修飾的成員的初始化,引用成員的初始化,子類呼叫父類的建構函式初始化父類成員)引數列表在建構函式執行之前執行,引數列表中執行的是初始化(所有的成員,無論是否出現在引數列表中,都

三種情況必須在類建構函式初始列表初始

//const成員的初始化只能在建構函式的初始化列表中進行 //引用成員的初始化也只能在建構函式的初始化列表中進行 class object { public:  object(int num = 0 ,int knum = 0):num_(num),knum_(knum),refnum_(num)  {

c++set的使用:初始和去重、排序

1.set的初始化可以直接用迭代器,set的定義和初始化方式包括: set<T> s;set<T> s(s1);set<T> s(b, e); 其中,b和e分別為迭代器的開始和結束的標記。 例如: #include <stdi

C++關於全域性物件的初始順序

在stackoverflow上看到下面這樣一個問題: 這個問題很簡單,意思就是兩個全域性不同類的instance,其中一個依賴另一個,怎麼確保他們的構造順序。也就是說O2依賴於o1,o2被例項化之前,我們要確保o1一定要被構造出來,或者說初始化。就上面來看,如果這

C++11新特性之列表初始

在我們實際程式設計中,我們經常會碰到變數初始化的問題,對於不同的變數初始化的手段多種多樣,比如說對於一個數組我們可以使用 int arr[] = {1,2,3}的方式初始化,又比如對於一個簡單的結構體: struct A { int x; int y; }a={1,2

C++二維陣列的初始

在C++中,二位陣列有兩種使用方式。 第一種是靜態宣告及初始化,如下: int array2[3][2]={{4,2},{5},{6}};第二種是,有時我們不知道二維陣列需要多少行和多少列,這時是動態陣列。 int **array; 後來我們通過輸入來獲取陣列的行n

總結C++幾種結構體初始的方法

部落格地址:http://www.cnblogs.com/vongang/ 結構體能自由組裝資料,是一種很常見的資料打包方法。 當我們定義一個結構體後,沒有初始化就使用,就會使用到垃圾資料,而且這種錯誤很難發現。 在程式設計時對於定義的任何變數,我們最好都先初始化。 除了使

C#類的建立和例項

     C#中,例項化就是建立物件的過程,使用關鍵字new來建立。      在看C#視訊中遇到這麼一個例子,就是更改物件的密碼。我們就通過這個例子來理解一下類的建立和例項化。      1、首先要

C#使用Json.Net進行序列和反序列及定製

  序列化(Serialize)是將物件轉換成位元組流,並將其用於儲存或傳輸的過程,主要用途是儲存物件的狀態,以便在需要時重新建立該物件;反序列化(Deserialize)則是將上面的位元組流轉換為相應物件的過程;在.Net陣營中,Json.Net是由官方推薦的高效能開源序列化/反序列化工具,其官方網站:ht

C++字面值常量和字面值型別

作者:zhaojia92  來源:CSDN  原文:https://blog.csdn.net/zhaojia92/article/details/50831436  版權宣告:本文為博主原創文章,轉載請附上博文連結!      

C#的棧和堆、值型別與引用型別、值引數、引用引數、輸出引數、引數陣列

程式執行時,資料必須儲存在記憶體中,一個數據需要多大的記憶體、儲存的位置、如何儲存依賴於該資料的資料型別。執行中的程式使用兩個記憶體區域來儲存資料:棧和堆。 棧:                 棧是一

C++:Main函式引數列表及引數型別轉換

有三個問題待解決: 1、C/C++ main函式引數意義 2、怎麼向main函式傳參 3、傳進來的引數型別是什麼?怎麼型別轉換? 下面來分別分析! 首先,看程式碼,然後分析。 int main(in

c++關於char陣列/char*指標/string型別 之間的愛恨情

小渣渣一直被有關string和char[]以及char*的相關問題弄得痛不欲生,傳參、返回值、函式呼叫等到底應該用哪種形式這真的是讓小渣癲狂了,今天就好好稍微整理一下吧(歡迎補充與指正) 大多也是我從

c++按位取反運算,型別轉換,擴位

#include <stdio.h> #include <iostream> using namespace std; void main() {   //做這類題目抓住兩點:第一、無論是以進製表示還是整數形式賦值給變數,都要根據變數相應  //的資

C++堆的使用及自定義型別排序

簡介 C++中堆(heap)是在vector的基礎上實現的。具體地,是定義了一些方法在vector型別資料上進行操作,包括 - make_heap 建立堆(預設最大堆) - push_heap 加入元素 - pop_heap 刪除元素 - sort_h

C++,有哪4個與型別轉換符相關的關鍵字?這些關鍵字各有什麼特點,在什麼場合下使用?

1 reinterpret_cast ‘reinterpret_cast’轉換一個指標為其它型別的指標。它也允許從一個指標轉換為整數型別。反之亦然。(譯註:是指標具體的地址值作為整數值?) 這個操作符能夠在非相關的型別之間轉換。操作結果只是簡單的從一個指標到

c++,有哪4個與型別轉換相關的關鍵字,這些關鍵字各有什麼特點,應該在什麼場合下使用?

1、reinterpret_cast<type-id> (expression) type-id 必須是一個指標、引用、算術型別、函式指標或者成員指標。它可以把一個指標轉換成一個整數,也可以把一個整數轉換成一個指標(先把一個指標轉換成一個整數,再把該整數轉換成原型別的指標,還可以得到原先的指標值