命名空间管理
通过using namespace std;引入整个命名空间或通过using std::cout;仅引入特定成员到当前作用域中。
#include <iostream>
using std::cout;
using std::endl;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
#include <iostream>
using namespace std;
int main() {
cout << "Hello, World!" << endl;
return 0;
}
类型别名
using作为typedef替代品的功能,它允许为现有类型创建更简洁的名字。
基本类型别名
using MyInt = int;
MyInt value = 42;
模板类型别名
template<typename T>
using VectorOfPtr = std::vector<T*>;
VectorOfPtr<int> ptrVec; // 等价于 std::vector<int*>
对于类成员的使用
在继承关系中使用using声明来改变基类成员的可见性。比如,在私有或保护继承的情况下,可以通过using将基类的公共成员变为派生类的公共成员。同时,当涉及到重载函数时,using可以帮助保留所有重载版本而不必逐一重新声明它们。
改变基类成员的可见性
class Base {
public:
void show() { std::cout << "Base" << std::endl; }
protected:
void hide() {}
};
class Derived : private Base {
public:
using Base::show; // 使基类的public方法成为派生类的public方法
protected:
using Base::hide; // 使基类的protected方法成为派生类的protected方法
};
int main() {
Derived d;
d.show(); // 可以调用
//d.hide(); // 编译错误,因为hide是protected
return 0;
}
处理重载函数
class Base {
public:
virtual void func(int) { std::cout << "Base func(int)" << std::endl; }
virtual void func(double) { std::cout << "Base func(double)" << std::endl; }
};
class Derived : public Base {
public:
using Base::func; // 引入所有重载版本
void func(int) override { std::cout << "Derived func(int)" << std::endl; }
};
int main() {
Derived d;
d.func(1); // 调用Derived::func(int)
d.func(1.0); // 调用Base::func(double),即使它被重写了
return 0;
}
需要注意的是,如果没有使用using引入重载,那么上述代码将调用两次Derived::func(除非在Derived手动添加了func(double)的重写)。
对于enum的使用
using enum 声明引入命名枚举的枚举符名称,就像对每个枚举符使用using声明一样。当在类范围内时,using enum 声明将命名枚举的枚举符作为成员添加到作用域中,使其可用于成员查找。但是需要注意using enum只在c++20以后有效
enum class fruit { orange, apple };
struct S
{
using enum fruit; // OK: introduces orange and apple into S
};
void f()
{
S s;
s.orange; // OK: names fruit::orange
S::orange; // OK: names fruit::orange
}
如果enum有用同名的使用using enum会冲突
enum class fruit { orange, apple };
enum class color { red, orange };
void f()
{
using enum fruit; // OK
// using enum color; // error: color::orange and fruit::orange conflict
}
818

被折叠的 条评论
为什么被折叠?



