C++语法手册

using用法

  1. 导入命名空间

    1
    2
    3
    4
    // 导入整个命名空间到当前作用域,这样std::cout就可以写成cout了。
    using namespace std;
    // 只导入某个变量到当前作用域
    using std::cout;

    一般头文件中要避免使用using导入命名空间。否则引入这个头文件的也相当于导入了命名空间,容易带来命名冲突。

  2. 指定别名,C++11中可以使用using来指定别名,作用与typedef相同

    1
    2
    typedef int T; // 用 T 代替 int
    using T = int; // 用 T 代替 int
  3. 派生类引入基类成员

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Base {
    protected: //此处可以改成public,但不能改成private
    int value;
    int name;
    };

    class Derived : private Base { //Base是私有继承
    public:
    //通过Derived的实例可以访问父类的value,但是无法访问父类的name变量
    using Base::value;
    };

类型转换

static_cast

1
2
3
4
5
6
class B {};
class D : public B {};

D d;
B& b = d;
D& newD = static_cast<D&>(b);

代码中D和B的继承关系不是虚继承(没有virtual修饰继承关系),如果是虚继承,就无法使用static_cast了。

dynamic_cast

1
2
3
4
5
6
7
8
9
10
11
class B {
public:
virtual void test() {}
};
class D : virtual public B {};

D d;
B& b = d;
D& newD = dynamic_cast<D&>(b); // downcast

B& newB = dynamic_cast<B&>(d); //可以成功,但无必要,可以直接使用B& newB = d;效率更高

上述代码有两个关键点:1)D与B的继承关系通过virtual修饰;2)B包含虚函数。只有这两个条件同时满足才能使用dynamic_cast。另外与static_cast区别是:static_cast必然成功,而dynamic_cast失败的情况会返回target-type类型的空指针。

值分类

Value categories介绍了 lvalue/prvalue/xvalue/glvalue/rvalue

参考

C++ Core Guidelines
C++ 语言参考