为什么在类的声明中给数据成员赋值,但是编译器不报错
时间: 2023-06-17 20:02:30 浏览: 151
在类的声明中给数据成员赋值是合法的语法,这被称为成员初始化列表。成员初始化列表提供了一种在构造函数体之前初始化成员的方式,可以提高效率和代码的可读性。
如果没有使用成员初始化列表,数据成员的默认构造函数将在构造函数体之前被调用,然后在构造函数体中再进行赋值操作。这样做会增加额外的构造函数调用和赋值操作,影响程序的性能。
所以,成员初始化列表是一种良好的编程习惯,可以提高程序的效率和可读性。编译器不会报错是因为这是合法的语法,但是如果成员初始化列表和构造函数体中的初始化操作冲突,编译器会发出警告或错误提示。
相关问题
报错In template: call to implicitly-deleted copy constructor of '(lambda at
这个错误提示通常出现在试图复制或赋值一个不可拷贝的 Lambda 对象时。Lambda 表达式通常是轻量级的,它们并不是标准库里的独立对象,而是直接集成到代码中的。如果 Lambda 引用了外部的非静态数据成员或捕获了大量的 this 指针(即使用了 `&this`),那么它的拷贝构造函数默认是隐式禁止的,因为这样的拷贝可能会导致数据不一致。
当你尝试像对待普通对象那样对 Lambda 进行复制或赋值操作时(例如,将它赋值给另一个 `std::function` 或者作为函数参数传递给一个接受复制的函数),编译器就会抛出这个错误。解决这个问题的一种常见方法是在 Lambda 中声明拷贝构造函数并显式禁止它(`private:` 或 `= delete`),然后只提供移动构造函数和赋值运算符来支持资源的转移。
```cpp
// 示例
struct NoCopyLambda {
explicit NoCopyLambda(int x) : value(x) {}
NoCopyLambda(const NoCopyLambda&) = delete; // 显式禁用复制构造
NoCopyLambda(NoCopyLambda&& other) noexcept : value(other.value) { other.value = 0; } // 提供移动构造
void operator=(const NoCopyLambda&) = delete;
void operator=(NoCopyLambda&& other) noexcept { value = other.value; other.value = 0; }
private:
int value;
};
// 对于 Lambda,可以这样做类似的事情
```
阅读全文