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〉。