在c中定义别名的方式是typedef,但是他有一些限制,比如不能定义一个模板。
// 一个固定以 std::string 为 key 的 map,它可以映射到 int 或另一个 std::string。然而这个简单的需求仅通过 typedef很难实现
// c++98/03
template <typename Val>
struct str_map
{
typedef std::map<std::string, Val> type;
};
// ...
str_map<int>::type map1;
// c++ 11
template <typename Val>
using str_map_t = std::map<std::string, Val>;
str_map_t<int> map1;
1. 命名空间的using 声明
我们在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声明,则后面使用就无须前缀了。
using std::cin; //using声明,当我们使用cin时,从命名空间std中获取它
int main()
{
int i;
cin >> i; //正确:cin和std::cin含义相同
cout << i; //错误:没有对应的using声明,必须使用完整的名字
return 0;
}
2. 在子类中引用基类成员
在子类中对基类成员进行声明,可恢复基类的防控级别。有三点规则:
1. 在基类中的private成员,不能在派生类中任何地方用using声明。
2. 可以在派生类中任何地方用using声明。当在public下声明时,在类定义体外部,可以用派生类对象访问该成员,但不能用基类对象访问该成员;当在protected下声明时,该成员可以被继续派生下去;当在private下声明时,对派生类定义体外部来说,该成员是派生类的私有成员。
3. 在基类中的public成员,可以在派生类中任何地方用using声明。具体声明后的效果同基类中的protected成员。