2009-09-07 132 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。