Using的使用方法
1,命名空間的使用
- 為了防止代碼沖突,都會使用到命名空間。假設這樣一種情況,當一個班上有兩個名叫 Zara 的學生時,為了明確區分他們,我們在使用名字之外,不得不使用一些額外的信息,比如他們的家庭住址,或者他們父母的名字等等。
- 同樣的情況也出現在 C++ 應用程序中。例如,可能會寫一個名為 xyz() 的函數,在另一個可用的庫中也存在一個相同的函數 xyz()。這樣,編譯器就無法判斷所使用的是哪一個 xyz() 函數。 因此,引入了命名空間這個概念,專門用于解決上面的問題,它可作為附加信息來區分不同庫中相同名稱的函數、類、變量等。使用了命名空間即定義了上下文。本質上,命名空間就是定義了一個范圍。 我們舉一個計算機系統中的例子,一個文件夾(目錄)中可以包含多個文件夾,每個文件夾中不能有相同的文件名,但不同文件夾中的文件可以重名。
- 比如 namespace sdf;
- 在編碼的時候還可以使用sdf::加具體的類方法,也可以使用using namespace sdf;
不連續的命名空間
- ?命名空間可以定義在幾個不同的部分中,因此命名空間是由幾個單獨定義的部分組成的。一個命名空間的各個組成部分可以分散在多個文件中。 所以,如果命名空間中的某個組成部分需要請求定義在另一個文件中的名稱,則仍然需要聲明該名稱。下面的命名空間定義可以是定義一個新的命名空間,也可以是為已有的命名空間增加新的元素:
namespace namespace_name {// 代碼聲明
}
?嵌套的命名空間
- 命名空間可以嵌套,您可以在一個命名空間中定義另一個命名空間,如下所示:
namespace namespace_name1 {// 代碼聲明namespace namespace_name2 {// 代碼聲明}
}
- ?可以通過使用::運算符號來訪問嵌套的命名空間中的成員
?
2,在子類中引用基類的成員
class T5Base {
public:T5Base() {}virtual ~T5Base() {}static void test1() { std::cout << "T5Base test1..." << std::endl; }//protected:
// static int T5Base::value = 9;
};class T5Derived :T5Base {
public:using T5Base::test1;
// using T5Base::value;
// void test2() { std::cout << "value is " << value << std::endl; }
};//主函數
T5Derived::test1();
- 基類中的成員變量是public的,但是在private繼承之后,對于外界這個數值就是private的,也就是T5Derived無法使用這個value;這個時候需要使用using T5Base::test1就可以使用了。
- 上面的value,我沒有改對,有會的小伙伴可以教教我
- using只是引用,不參與形參的指定
3,別名的指定
- 在C++11中,提出了使用using指定別名,using value_type = Ty;那么以后使用value_type的地方就代表使用了Ty
- 這種使用的方法類似于typedef,那么二者之間的區別在于什么地方呢?
例如
- typedef std::unique_ptr<std::unordered_map<std::string, std::string>> UPtrMapSS;
- using UPtrMapSS = std::unique_ptr<std::unordered_map<std::string, std::string>>;
但是別的更加復雜的場景會讓你覺得使用using會更加簡單一些
-
typedef void (*FP) (int, const std::string&);
- 如果不熟悉指針和typedef,很難看出FP是一個別名,代表著一個函數指針,而指向函數的返回類型是void,接受的參數是int、const std::string &;
- 如果使用C++11,using FP = void (*) (int, const std::string&);Fp是一個別名,using將別名的名字放在了左邊,而將別名指向了右邊,簡單清晰
using可以實現但是typedef不可以使用?alias templates, 模板別名
- template <typename T>
- using Vec = MyVector<T, MyAlloc<T>>; ?
- // usage
- Vec<int> vec;
參考鏈接
- C++ 中using 的使用
?
?
?