C++ using的使用方法
1、引入名空间
例:using namespace std;
2、改变个别成员的可访问性
《C++ Primer》中有个例子是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 |
class Base{ public: std::size_t size() const { return n; } protected: std::size_t n; }; class Derived : private Base { public: using Base::size; protected: using Base::n; }; |
类Derived私有继承了Base,对于它来说成员变量n和成员函数size都是私有的,如果使用了using语句,可以改变他们的可访问性,如上述例子中,size可以按public的权限访问,n可以按protected的权限访问。
3、函数重载
这一点在一定意义上和上面一点类似。
在继承过程中,派生类可以覆盖重载函数的0个或多个实例,一旦定义了一个重载版本,那么其他的重载版本都会变为不可见。
如果对于基类的重载函数,我们需要在派生类中修改一个,又要让其他的保持可见,必须要重载所有版本,这样十分的繁琐。
我们可以用using来解决这个问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <iostream> using namespace std; class Base{ public: void f(){ cout<<"f()"<<endl; } void f(int n){ cout<<"Base::f(int)"<<endl; } }; class Derived : private Base { public: using Base::f; void f(int n){ cout<<"Derived::f(int)"<<endl; } }; int main() { Base b; Derived d; d.f(); d.f(1); return 0; } |
输出:
f()
Derived::f(int)
如上代码中,在派生类中使用using声明语句指定一个名字而不指定形参列表,所以一条基类成员函数的using声明语句就可以把该函数的所有重载实例添加到派生类的作用域中。此时,派生类只需要定义其特有的函数就行了,而无需为继承而来的其他函数重新定义。
4、取代typedef
C中常用typedef A B这样的语法,将B定义为A类型,也就是给A类型一个别名B
对应typedef A B,使用using B=A可以进行同样的操作,例如:
1 2 3 4 5 6 |
using V = std::vector<int>; V vec; //等价于std::vector<int> vec; using func = void (*) (int, int); //func被定义为函数指针 |
但是using的功能比typedef更强大,可以定义模板别名,例如:
1 2 3 4 |
template <typename T> using MapString = std::map<T, std::string>; MapString<int> mp; //等价于std::map<int, std::string> mp; |
本文出自shad0w_walker,转载时请注明出处及相应链接。
本文永久链接: https://www.sdwalker.com/archives/771.html