C ++ Copy构造语法

时间:2009-09-07 15:31:37

标签: 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;
};

我理解复制构造函数,但我记得语法为Class :: Class(const Class&amp; p)。我在想别的东西,还是那种替代语法?

谢谢!

5 个答案:

答案 0 :(得分:10)

它与复制ctor没什么关系。您正在使用带有模板参数t1的sizeof的初始化列表初始化变量m_nSize。

答案 1 :(得分:3)

无法直接在类定义中初始化成员变量。这称为初始化列表。你可以想象它是这样的:

const int m_nSize = sizeof(t1);

C ++ 0x顺便提一下上面的表格。

答案 2 :(得分:1)

CTypeSize(const T&amp; 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)的值。

答案 3 :(得分: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”)。

答案 4 :(得分:0)

关于成员变量CTypeSize::m_nSize的声明还有一个重要的事情。您是否注意到该声明中的const修饰符?

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

正如AraK所提到的,在C ++ 11中,const member-var也可以用const表达式初始化。这是编译时的情况,而初始化列表允许const member-var在运行时初始化。