深入理解C++11

深入理解C++11

稳定性和兼容性

宏定义

名称 作用
__STDC_HOSTED__ 判断是否拥有完整C库
__func__ 返回函数名称
__cplusplus 指出当前版本,用于版本兼容

构造方面

继承构造函数

class Base {
public:
    Base(int val): val(val) {}
private:
    int val;
};
class Derived: public Base {
public:
    //just do some function, no extra member value. use inherit constructor.
    using Base::Base;
};

委托构造中对于异常的处理。看起来可能有点奇怪。

class base {
public:
    base(int i) try : base() {
        
    }
    catch(...) {
           
    }
    
    
private:
    base() {
        cout << "going to throw " << endl;
        throw 0;
    }
};

垃圾回收

基本方式有

  1. 基于引用计数:reference counting garbage collector
  2. 基于追踪处理:tracing garbage collector
    1. Mark-Sweep
    2. Mark-Compact
    3. Mark-Copy

为什么C++支持垃圾回收的道路这么艰难呢?

主要是因为C/C++对于指针的放纵。看这个例子

int main() {
    int *p = new int;
    p += 10; //移动到别的地址,即原来的地址就没有被引用了。
    p -= 10; //移动回来,但此时可能已经垃圾回收了,这块地址就无效了。
    *p = 20; //如果已经被回收,那么这样就是undefined behavior。
    return 0;
}

类型推导

auto推导:推导出类型,但不保留constvolatile,引用等属性。

template推导:推导规则大部分和auto相似。

decltype推导:能够保留constvolatile,引用等属性

特性

decltype的妙用

推导返回值

变长模板

template<typename... Args>
void f(Agrs... args) {
 	cout << sizeof...(args) << endl; //打印有多少个参数。
    func(args...); //将args作为参数调用func。
    func(args)... //对每一个参数都调用func。
}

万能引用

template<typename T>
void f(T&& t);

完美转发在万能引用中的使用。

template<typename T>
void f(T&& t) {
    func(std::forward<T>(t)); //保留t原有类型,转发给对应函数。
}

变长模板与万能引用

template<typename... Args>
void f(Agrs&&... args) {
}

变长模板的完美转发

template<typename T>
void f(Args&&... args) {
    func(std::forward<Args>(args)...); //多参数也能进行完美转发。
}

其他API

is_same<>::value;
is_const<>::value;
is_volatile<>::value;
is_lvalue_reference<>::value; //判断是否左值引用
is_rvalue_reference<>::value; //判断是否右值引用 

深入理解C++11
https://messenger1th.github.io/2024/07/24/C++/深入理解C++11/
作者
Epoch
发布于
2024年7月24日
许可协议