C++中的using关键字
在C++中,using
是一个多功能关键字,它有几种不同的用途,主要涉及到命名空间、类型别名以及重载决议等方面。下面分别对这些用途进行解释:
1. 引入命名空间成员
使用 using
关键字可以引入命名空间中的特定成员或者整个命名空间到当前作用域,这样就不必每次都写出完整的命名空间前缀。
-
引入单个成员:
using namespace::Name;
这样之后就可以直接使用
Name
而不必写全命名空间路径。 -
引入整个命名空间(不推荐在全局作用域做这个操作,因为它可能导致名称冲突):
using namespace std;
2. 类型别名(typedef的升级版)
using
可以用来定义类型别名,这种方式更加直观和灵活,类似于C语言中的 typedef
。
- 定义类型别名:
例如:using NewTypeName = OriginalTypeName;
using SP_TRADE_API = std::shared_ptr<CLocalTraderApi>;
3. 重载函数解析
在函数重载中,using
声明可以用来指定使用特定基类的函数版本,避免歧义。
- 基地类成员函数的显式调用:
class Derived : public Base { void someFunction() override { // 显式调用基类版本 Base::someFunction(); // 或者使用 using 声明 using Base::someFunction; someFunction(); // 现在调用的是基类的someFunction } };
4. 命名空间别名
除了类型别名,using
也可以为命名空间定义别名,这在处理长命名空间路径时非常有用。
- 命名空间别名:
namespace very_long_namespace_name { // ...内容... } using namespace_alias = very_long_namespace_name; // 现在可以这样使用 namespace_alias::SomeClass obj;
5. using
声明与 typedef
的对比
虽然 typedef
和 using
都可以用来定义类型别名,但 using
提供了更广泛的功能,包括直接支持模板类型别名,并且语法上更为直观,尤其是在涉及模板和复杂类型时。
多用组合、少用继承
基于接口而非实现进行编程