using 用來導入名稱,最常見的是導入名稱空間,例如,想使用 std 名稱空間中的名稱,又不想加上 std:: 前置的話,之前文件中許多範例都是如下撰寫:
using namespace std;
如果名稱空間形成巢狀,也可以指定內部的名稱空間,例如:
using namespace util::xyz;
using 不一定要撰寫在全域,也可以在函式或方法中撰寫,例如,僅在 foo 中導入 std 中的名稱:
void foo() {
using namespace std;
cout << "XD" << endl;
}
using 也可用來導入某個名稱,例如僅導入 std::string、std:cout:
#include <iostream>
#include <string>
using std::string;
int main() {
string str = "Example";
using std::cout;
cout << str;
}
在〈shared_ptr〉中也看過,指明接下來的範疇中,使用的 swap 都會是 std::swap,而不是 SharedPtr 的 swap 方法:
...
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 中有 public 的 publicMember 及 protected 的 protectedMember:
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〉。

