目录
1、noexcept:用于指定函数不会抛出异常
2、deleted functions:该函数被明确地标记为已删除
3、constexpr:表示可以在编译时求值的常量表达式函数或变量
4、 decltyp:用于推断表达式类型
5、nullptr:表示空指针常量
6、static_assert:用于在编译时进行断言
7、auto:用于自动推断变量类型
8、override:用于重写父类虚函数
9、 final:用于禁止类被继承或虚函数被重写
10、thread_local:用于声明线程局部变量
11、alignas:用于指定变量或类型的对齐方式
1、noexcept:用于指定函数不会抛出异常
是一个 C++11 关键字,用于指示函数是否可能抛出异常。如果在函数声明或定义中使用了 noexcept 关键字,则表示该函数不会抛出任何异常。如果函数在运行时抛出了异常,则会导致程序直接终止,而不会调用异常处理程序。使用 noexcept 关键字可以提高代码的可靠性和效率。
void foo() noexcept
{
std::cout << "This function is noexcept\n";
}
2、deleted functions:该函数被明确地标记为已删除
C++11中的deleted functions是指通过在函数声明中,用语法= delete;
来将函数定义为"已删除",来明确禁止编译器生成该函数的定义,任何使用"已删除"函数的代码都会产生编译错误。
这可以用于防止某些不希望发生的情况发生,例如禁止对象进行拷贝或移动。
class MyClass
{
public:
void Test() = delete;
};
MyClass value;
value.Test(); // 编译错误:attempting to reference a deleted function
3、constexpr:表示可以在编译时求值的常量表达式函数或变量
constexpr 是 C++11 引入的一个关键字,它用于表示一个表达式或函数可以在编译时求值,而不是在运行时求值。使用 constexpr 可以使编译器在编译时对代码进行优化,从而提高程序的性能。
constexpr 可以用于变量声明、函数声明和类中的成员函数声明。对于变量声明,constexpr 表示该变量的值可以在编译时确定;对于函数声明,constexpr 表示该函数可以在编译时求值,并且返回值可以用于常量表达式;对于类中的成员函数声明,constexpr 表示该函数可以在编译时求值,并且可以用于常量表达式。
使用 constexpr 时需要注意以下几点:
1. constexpr 只能用于常量表达式,也就是在编译时可以确定值的表达式。
2. constexpr 变量必须在声明时进行初始化。
3. constexpr 函数的参数和返回值必须是字面值类型。
4. constexpr 函数的函数体必须是单一返回语句或者赋值语句。
5. constexpr 成员函数必须在类的声明中定义。
总之,constexpr 关键字可以使编译器在编译时对代码进行优化,从而提高程序的性能。
示例:
#include <iostream>
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int num = 5;
constexpr int result = square(num);
std::cout << "The square of " << num << " is " << result << std::endl;
return 0;
}
4、 decltyp:用于推断表达式类型
decltyp是C++11中引入的关键字,用于获取表达式的类型。
#include <iostream>
#include <typeinfo>
int main() {
auto x = 1 + 2.0; // 自动推导为double类型
std::cout << "x is of type " << typeid(x).name() << '\n';
decltype(x) y = 3; // y的类型为double
std::cout << "y is of type " << typeid(y).name() << '\n';
return 0;
}
5、nullptr:表示空指针常量
6、static_assert:用于在编译时进行断言
7、auto:用于自动推断变量类型
8、override:用于重写父类虚函数
9、 final:用于禁止类被继承或虚函数被重写
final关键字可以用于类、方法和变量上,其含义如下:
1. final类:不能被继承,即不能有子类。
2. final方法:不能被子类重写,即不能修改方法的实现。
3. final变量:一旦赋值,就不能再修改其值,即成为常量。
使用final关键字的好处:
1. 提高程序的安全性:final类不能被继承,可以防止子类对其进行修改。
2. 提高程序的效率:final方法不能被重写,可以避免动态绑定带来的性能损失。
3. 代码可读性更好:final变量一旦赋值,就不能再修改其值,可以避免对变量值的误操作。
10、thread_local:用于声明线程局部变量
thread_local 是 C++11 引入的关键字,用于声明线程局部变量。
线程局部变量是每个线程独有的变量,每个线程访问的都是自己的变量,互不干扰。使用 thread_local 可以避免多线程中的竞态条件,提高程序效率和安全性。线程局部变量在定义时需要使用 thread_local 关键字进行修饰,例如:
thread_local int count = 0;
这样定义的变量 count 就是线程局部变量了。每个线程都有自己的 count 变量,互不干扰。线程局部变量可以用于多线程编程中的线程同步、线程池等场景。
11、alignas:用于指定变量或类型的对齐方式
alignas关键字用于指定变量或成员的对齐方式,以便在内存中更有效地存储数据。
下面是一个使用alignas关键字的示例:
#include <iostream>
#include <cstdint>
struct alignas(16) MyStruct {
int16_t a;
int32_t b;
int64_t c;
};
int main() {
std::cout << "sizeof(MyStruct) = " << sizeof(MyStruct) << std::endl;
std::cout << "alignof(MyStruct) = " << alignof(MyStruct) << std::endl;
MyStruct s;
std::cout << "&s = " << &s << std::endl;
std::cout << "&s.a = " << (void*)&s.a << std::endl;
std::cout << "&s.b = " << (void*)&s.b << std::endl;
std::cout << "&s.c = " << (void*)&s.c << std::endl;
return 0;
}
输出结果:文章来源:https://www.toymoban.com/news/detail-473970.html
sizeof(MyStruct) = 16
alignof(MyStruct) = 16
&s = 0x7ffee5b1b9f0
&s.a = 0x7ffee5b1b9f0
&s.b = 0x7ffee5b1b9f4
&s.c = 0x7ffee5b1b9f8
在这个示例中,我们定义了一个结构体MyStruct,并使用alignas(16)指定了它的对齐方式为16字节。结构体中包含3个成员变量,分别为int16_t、int32_t和int64_t类型。在main函数中,我们打印了MyStruct的大小、对齐方式以及每个成员变量的地址。由于我们指定了对齐方式为16字节,所以结构体的大小也是16字节,并且每个成员变量的地址都是16的倍数。文章来源地址https://www.toymoban.com/news/detail-473970.html
到了这里,关于C++11:关键字的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!