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 的使用