使用 using


using用来导入名称,最常见的是导入命名空间,例如,想使用std命名空间中的名称,又不想加上std::前置的话,之前文件中许多范例都是如下编写:

using namespace std;

如果命名空间形成嵌套,也可以指定内部的命名空间,例如:

using namespace util::xyz;

using不一定要编写在全局,也可以在函数或方法中编写,例如,仅在foo中导入std中的名称:

void foo() {
    using namespace std;
    cout << "XD" << endl;
}

using也可用来导入某个名称,例如仅导入std::stringstd:cout

#include <iostream>
#include <string>
using std::string;

int main() {
    string str = "Example";
    using std::cout;
    cout << str;
}

在〈shared_ptr〉中也看过,指明接下来的范畴中,使用的swap都会是std::swap,而不是SharedPtrswap方法:

...
void swap(SharedPtr& sharedPtr) {
    using std::swap;
    swap(this->p, sharedPtr.p);
    swap(this->pctr, sharedPtr.pctr);
    swap(this->del, sharedPtr.del);
}

using也可以用于类继承时定义的导入,例如〈继承共同行为〉中看过,可以使用using将继承的成员导入至指定的权限区块,当时举的例子是,若父类P中有publicpublicMemberprotectedprotectedMember

class D : private P {
public:
    using P::publicMember;    // 维持 public

protected:
    using P::protectedMember; // 维持 protected
};

实际上,也可以将父类中protected权限,以using导入子类中的public区块:

class D : private P {
public:
    using P::publicMember;    // 维持 public
    using P::protectedMember; // 成为 public
};

继承共同行为〉中也看过,想直接继承父类定义的构造流程,可以透过using指定父类名称来达到:

class SwordsMan : public Role {
public:
    using Role::Role;

    void fight() {
        cout << "挥剑攻击" << endl;
    }
};

在〈覆盖父类方法〉中看过,using也可用来定义名称,例如,定义super为父类,之后使用super来代表父类:

class SwordsMan : public Role {
    using super = Role;

public:
    using Role::Role;

    void fight() {
        cout << "挥剑攻击" << endl;
    }

    string to_string() {
        return "SwordsMan" + super::to_string();
    };
};

其他更多有关using的细节,可以参考〈Using-declaration〉。


展开阅读全文