2009-09-07 134 views
2

我提前道歉,我的C++很生疏......C++拷貝構造函數語法

是什麼

: m_nSize(sizeof(t1)) 

指的是在下面的部分?

class CTypeSize 
{ 
    public: 
     template<class T> 
     CTypeSize(const T &t1) : 
     m_nSize(sizeof(t1)) 
     { 
     } 
     ~CTypeSize(void){ }; 
     int getSize(void) const{ return m_nSize; } 
    private: 
     const int m_nSize; 
}; 

我理解拷貝構造函數,但我記得語法類::類(常量類& P)。我在想別的什麼,或者是另一種語法?

謝謝!

回答

10

這與複製ctor沒有任何待辦事項。您正在使用具有模板參數t1的大小的初始化程序列表初始化變量m_nSize。

3

無法直接在類定義中初始化成員變量。這被稱爲初始化列表。你可以想象它是這樣的:

const int m_nSize = sizeof(t1); 

C++ 0x允許上述形式的方式。

1

CTypeSize(const T & t1)是該類的構造函數。 該類的成員可以在構造函數中初始化。

類識別TestClass { //構造:A,B,C設定爲 // 0,1,2個 識別TestClass():A(0),B(1),C(2) { }

int a,b,c; //會員 };

在你的例子中,「:m_nSize(sizeof(t1))」 意味着m_nSize用sizeof(t1)的 值初始化。

1

你的問題是雙重:

: member(value)語法的新對象的成員初始化爲value

但是template< typename T> Class(const T&)不是的複製構造函數。那一個是Class(const Class&)

所以

#include <iostream> 
struct C { 
    template< typename T > 
    C(const T& t) { std::cout << "T"; } 

    // C(const C& c) { std::cout << "C"; } 
}; 

int main() { C c1(1); C c2(c1); } 

將導致模板的構造函數被調用,然後是「合成的」拷貝構造函數(將輸出只是「T」)。

當您插入拷貝構造函數明確,那個會被調用(輸出將是「TC」)。

0

關於成員變量CTypeSize::m_nSize的聲明還有一個更重要的事情。您是否注意到該聲明中的const修飾符?

class member-var declared as "const"只能在初始化列表中初始化。

正如AraK所述,在C++ 11中,const成員-var也可以用const表達式初始化。這是編譯時的情況,初始化列表允許在運行時初始化const member-var。