20241119
noexcept注意事项
-
函数不能抛出异常: 如果你在一个标记为
noexcept
的函数中确实抛出了异常,程序将会调用std::terminate()
,导致程序异常终止。 -
运算符重载: 在重载一些运算符时,如果这些运算符不应抛出异常,可以使用
noexcept
。 -
性能优化: 使用
noexcept
可以帮助编译器进行某些优化,尤其是在 STL 容器和算法中,有助于提高性能。
总之,合理使用 noexcept
可以提升代码的可靠性和性能,但需要确保这些函数确实不会抛出异常。
`explicit` 关键字是 C++ 中的一个修饰符,用于防止编译器在某些情况下进行隐式类型转换。它通常用于构造函数,以避免潜在的误用或不希望的类型转换。
### 使用场景
1. **构造函数**: 当你定义一个只有单个参数的构造函数时,如果不加 `explicit`,则可以被用作隐式转换,这可能会导致意外的错误。例如:
```cpp
class MyClass {
public:
MyClass(int value) {
// 构造函数实现
}
};
void func(MyClass obj) {
// 函数实现
}
int main() {
func(10); // 隐式转换,创建一个 MyClass 对象
}
```
上面的代码在调用 `func(10)` 时,会隐式地将 `int` 转换为 `MyClass`。如果我们希望防止这种隐式转换,可以使用 `explicit`:
```cpp
class MyClass {
public:
explicit MyClass(int value) {
// 构造函数实现
}
};
int main() {
func(10); // 编译错误:无法从 int 隐式转换为 MyClass
}
```
2. **转换运算符**: 在类中定义转换运算符时,也可以使用 `explicit` 来防止隐式转换:
```cpp
class MyClass {
private:
int value;
public:
explicit operator int() const {
return value;
}
};
int main() {
MyClass obj;
int x = obj; // 编译错误:无法从 MyClass 隐式转换为 int
int y = static_cast<int>(obj); // 正确:需要显式转换
}
```
### 何时使用 `explicit`
- 当你有一个只有一个参数的构造函数且希望防止隐式类型转换时,应该使用 `explicit`。
- 在定义转换运算符时,若希望只允许显式地进行类型转换,也应使用 `explicit`。
### 总结
`explicit` 提供了一种方式来控制类型转换,从而提高代码的安全性和可读性。通过使用 `explicit`,你可以确保对象的构建和转换都是明确的,避免出现不必要的隐式转换引起的错误。
新建qt项目导致异常:-1: error: dependent ‘..\..\..\..\..\..\QTCreator\6.6.3\msvc2019_64\include\QtWidgets\QMainWindow‘
使用jom代替nmake取消勾选