using关键字的使用

命名空间管理

通过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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值