我提前道歉,我的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)。我在想别的东西,还是那种替代语法?
谢谢!
答案 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在运行时初始化。