类构造函数后面的一对括号有什么作用
What does a pair of brackets after class constructor do?
我们在这里用模板定义了一类复数:
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 替代项,并且仍允许您指定该成员应初始化为的值。 在第一个构造函数中,类型将设置为一些假定的理智默认值,该默认值可能是nullptr
或0
或0.0
或用户提供的默认构造,具体取决于实例化期间使用的实际T
类型。 这与未在初始化列表中列出成员变量或完全缺少列表的构造函数形成鲜明对比,这使得没有默认构造函数的成员未初始化 - 它们必须在构造函数主体中设置或由其他代码设置,然后才能从中读取它们,否则将出现未定义的行为(您的程序可能无法按预期工作)。
另外,您的类定义必须以分号结尾 - 在最后的}
之后。
函数后面的一对括号定义了没有主体的构造函数。成员变量在初始化列表中初始化:
: _real{real_}, _imag{imag_}
请注意,在某些情况下,编译器会保留以下划线开头的名称,通常应避免使用。
您在此处定义构造函数(不仅是声明)。第二个 ctor 正在初始化类成员/属性_real并_imag在其初始化列表中。
- archive_read_support_filter_all() 有什么作用?
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- 这个递归函数有什么作用?运行时的复杂性是多少?
- DrawShadow 中的 Elevation 究竟有什么作用?
- 测试"stream >> char"有什么作用?
- "uFlags &= ~CHN_PANNING"命令有什么作用?
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- int** a = new int*[n]();这个函数有什么作用?
- C++ 此函数调用之前的(void)有什么作用?
- i+=(i&-i) 有什么作用?它是便携式的吗?
- 这个size_t在 lambda 中有什么作用?C++代码
- 数组下标运算符 ([ ]) 对数组有什么作用?
- 结构之外的节点 * head 有什么作用?
- 重载括号运算符有什么作用?
- clang的"-Ofast"选项在实践中有什么作用,特别是对于与gcc的任何差异?
- std::make_unique_for_overwrite() 对 std::make_unique() 有什么作用?
- 运算符 delete[] 有什么作用?
- 下面的代码有什么作用?c++
- 这个陈述'p = I.ptr<uchar>(i);有什么作用?
- 这个嵌套的名称空间定义有什么作用