C++关键字using
C++关键字using
1.命名空间的声明
指定命名空间后可以省略xxx::
的前缀;
比如 std::cout
;
只要添加了using namespace std
,可以直接写cout
;
但是这样会造成一些冲突,如果同名函数在不同命名空间类,会造成混乱;
2.子类中引用基类成员
原则:
1.基类中private成员,不可用using声明;
2.基类中protected成员,在子类中public下声明,可被子类对象访问,不能被父类对象访问;其他和封装规则相同;
3.基类中public成员,声明和基类中protected相同;
在继承时,如果是私有继承,子类可以通过using来声明基类中protected方法,不会编译出错;
私有继承有什么用,还未研究;
3.使用using起别名
相当于传统的typedef起别名;
typedef std::vector<int> intvec;
using intvec = std::vector<int>; //这两个写法是等价的
用来定义函数指针,做到左右分离,更清晰;
typedef void (*FP) (int, const std::string&);
using FP = void (*) (int, const std::string&);
对模板的别名,typedef需要包装一层,using可直接使用;
//using
template <typename T>
using Vec = MyVector<T, MyAlloc<T>>;
Vec<int> vec;
//typedef
template <typename T>
struct Vec
{
typedef MyVector<T, MyAlloc<T>> type;
};
Vec<int>::type vec;
使用typedef时,把这样的类型用在模板类或者进行参数传递的时候,你需要使用typename强制指定这样的成员为类型,而不是说这样的::type是一个静态成员亦或者其它情况可以满足这样的语法;
而using则没有这样的问题;
//typedef
template <typename T>
class Widget
{
typename Vec<T>::type vec;
};
//using
template <typename T>
class Widget
{
Vec<T> vec;
};
Life is too short for so much sorrow.
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自 小紫苏!