类构造函数后面的一对括号有什么作用

What does a pair of brackets after class constructor do?

本文关键字:什么 作用 构造函数      更新时间:2023-10-16

我们在这里用模板定义了一类复数:

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是如何初始化的?

按照惯例,我希望在行尾有一个分号。

对于声明,但不是定义。如果构造函数是在类外部定义的,并且仅在类内部声明,那么您将有一个以分号结尾的声明

Vector3();

但在代码中,构造函数是在类中定义的。通常,不需要分号来标记函数定义的结尾。

构造函数后面的一对括号有什么作用?

如果你的意思是这对

Vector3() : _real{}, _imag{} {}
                             ^^

这就是构造函数主体。它是空的,因为所有工作都在初始化器列表中完成。

函数体定义括在{ ... }大括号中...每个构造函数末尾的那些指示不执行用户提供的操作的函数体。 换句话说,构造函数在操作初始化列表后不会执行任何操作。 你可以把例如 在大括号之间std::cout << "hellon";以"跟踪"对这些构造函数的调用。 使用分号而不是大括号只会声明 - 而不是定义 - 您的函数;稍后需要提供定义,并在可执行文件运行之前或运行时将其链接到可执行文件。

初始化列表中的{}用法(_real{} 等)是括号的 C++11 替代项,并且仍允许您指定该成员应初始化为的值。 在第一个构造函数中,类型将设置为一些假定的理智默认值,该默认值可能是nullptr00.0或用户提供的默认构造,具体取决于实例化期间使用的实际T类型。 这与未在初始化列表中列出成员变量或完全缺少列表的构造函数形成鲜明对比,这使得没有默认构造函数的成员未初始化 - 它们必须在构造函数主体中设置或由其他代码设置,然后才能从中读取它们,否则将出现未定义的行为(您的程序可能无法按预期工作)。

另外,您的类定义必须以分号结尾 - 在最后的}之后。

构造

函数后面的一对括号定义了没有主体的构造函数。成员变量在初始化列表中初始化:

: _real{real_}, _imag{imag_} 
请注意,在某些情况下,编译器

会保留以下划线开头的名称,通常应避免使用。

您在此处定义构造函数(不仅是声明)。第二个 ctor 正在初始化类成员/属性_real并_imag在其初始化列表中。