我们在这里用模板定义了一个复数的类:
template<typename T>
class complex {
T _real, _imag;
public:
// constructor line, with no parameter
Vector3() : _real{}, _imag{} {}
// constructor with pass-in variable
Vector3( T real_, T imag_ ) : _real{real_}, _imag{imag_} {}
inline T x() const { return _real; }
inline T y() const { return _imag; }
};
传统上我会期望在行尾有一个分号。构造函数后面的括号对做了什么?在第一种情况下如何初始化_real
和_imag
?
答案 0 :(得分:2)
传统上我预计会在行尾添加分号。
用于声明,但不是定义。如果构造函数是在类外定义的,并且只在内部声明,那么你有一个以分号结尾的声明
Vector3();
但在您的代码中,构造函数是在类中定义的。通常,您不需要分号来标记函数定义的结尾。
构造函数后面的括号对是做什么的?
如果你的意思是这对
Vector3() : _real{}, _imag{} {}
^^
是构造函数体。它是空的,因为所有工作都在初始化列表中完成。
答案 1 :(得分:0)
构造函数后面的括号对定义了没有body的构造函数。成员变量在初始化列表中初始化:
: _real{real_}, _imag{imag_}
请注意,在某些情况下,以下划线开头的名称是为编译器保留的,通常应该避免使用。
答案 2 :(得分:0)
您在这里定义构造函数(不仅仅是声明)。第二个ctor正在初始化列表初始化类成员/属性_real和_imag。
答案 3 :(得分:0)
函数体定义包含在{ ... }
括号中......每个构造函数末尾的函数体定义表示不执行用户提供的操作的函数体。换句话说,在执行初始化列表后,构造函数将不会执行任何操作。你可以把...大括号之间的std::cout << "hello\n";
来“跟踪”对这些构造函数的调用。使用分号代替大括号只会声明 - 而不是定义 - 你的函数;您需要稍后提供定义,并在运行之前或运行时将其链接到您的可执行文件。
初始化列表中的{}
用法 - _real{}
等 - 是括号的C ++ 11替代方法,并且仍允许您指定应该初始化该成员的值。在第一个构造函数中,类型将设置为某些假定的理智默认值,可能是nullptr
或0
或0.0
或用户提供的默认构造,具体取决于{的实际类型在实例化期间使用{1}}。这与没有在初始化列表中列出成员变量的构造函数形成对比,或者完全缺少列表,这使得没有默认构造函数的成员未初始化 - 它们必须在构造函数体中或在读取之前由其他代码设置来自,否则将有不确定的行为(您的程序可能无法按预期工作)。
另外,您的班级定义必须以分号结尾 - 在最终T
之后。