C++11:关键字

目录

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;
}

输出结果:

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的倍数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值