C++11特性补充笔记1

版权声明:所有的博客都是作为个人笔记的。。。。。。 https://blog.csdn.net/qq_35976351/article/details/82969106

__func__返回函数名:

const char* hello() { return __func__; }

返回hello

_Pragma(字符串字面常量)用于编译预处理:

_Pragma("once")

表明仅仅对头文件编译一次。

静态断言:static_assert()

和动态断言类似,都位于cassert头文件中,区别在于

  • assert动态断言处理的表达式是在程序运行期间的,只有返回式为true时能运行,但是影响程序的性能
  • static_assert静态断言在编译期间运行,不影响程序性能,更多的是用于程序编译时期的检查

使用方式为static_assert(表达式,编译输出的信息)

static_assert(sizeof(int) == 8, "This 64-bit machine should follow this!");

如果断言失败,输出错误的编译信息。

noexcept表示程序不会抛出异常,如果有异常发生,那么会调用std::terminiate()终止程序。

C++11可以使用初始化列表{}对类的成员数据进行初始化。

sizeof返回一条表达式或者一个类型名字占用的字节数,返回size_t类型的常量表达式。它不会求解实际运算对象的数值。有一规则:

  • char类型或者返回char类型的表达式,都返回1
  • 对引用类型返回引用对象空间的大小
  • 对一个只有构造函数和析构函数的类来说,返回结果是1;如果有成员变量,则返回成员变量占用空间的总和
  • 解引用指针执行返回指针指向对象占用空间的大小,指针不需要有效
  • 对数组执行返回数组所有元素占用空间的总和
  • stringvector只会返回固定部分的大小,与实际存储了多少数据无关。
  • C++11对非静态成员使用sizeof是合法的

尽量对重写的函数声明override,对不想被继承的类声明为final

extern基本解释:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定。

C++11中,模板也可以进行extern声明:

extern template void fun<int>(int);  // 外部模板声明

编译和链接时只有初始声明的生成代码。

C++中,如果子类要调用父类的函数,那么需要使用using关键字。

#include <bits/stdc++.h>
using namespace std;

struct Base {
    void fun(double i) {
        cout << "Base:" << i << endl;
    }
};

struct Derived: Base {
    using Base::fun;
    void fun(int i) {
        Base::fun(i);  // 可以直接调用
        cout << "Derived:" << i << endl;
    }
};

int main() {
    Derived d;
    d.fun(1);
    d.fun(1.1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/82969106