using用途浅析

来源:互联网 发布:数据集市的主题域 编辑:程序博客网 时间:2024/05/21 14:40

    using namespace std;

    在我们初识C++之时,我们应该是能经常看到这行代码的。书上说这样写能减少很多麻烦,好吧,在后来很长一段时间里估计大家都是这样做的。不管后来因为看了什么利弊减少了这样的写法,这些我们都暂且不提,本文的主题不是利弊,主题由此引入:

一、引入名称空间或指明名称空间

    如上,我们在代码中使用using可以引入名称空间,C++对原来的C库做了一些修改,很多头文件都改为无后缀.h的形式了,也有一些新增的库,而使用这些库可不仅仅是包含个头文件就行的,C++多了名称空间一说,这些库中的函数声明和变量声明均包含在名为std的名称空间中,我们使用时还需要指明std名称空间。比如我们使用cin,cout时,需要在开头加上:

    using namespace std;  或者  using std::cin;  using std::cout;

虽看似多了一步,但很多麻烦却也不知不觉中消弭了。比如,我们可以为变量或函数取一个和标准库中变量或函数相同的名字,只要使用了不同的名称空间,它们就代表了不同的含义。

二、指定类型别名

    有时,单纯的类型不能直观地表明我们的意图,如果注释再做得不到位,那我们隔一段时间再看的时候,就算是自己写的代码也会迷糊的。所幸,我们可以为类型取个别名。在传统C/C++中,我们可以使用typedef指定别名,比如:

    typedef int *Int_Ptr;

这样,我们就为一个int型指针赋予了更为直观的名字。不过这又出现了一个问题,如果我们要为一个数组定义别名呢,是要写作typedef int [] Int_Arr;  还是 typedef int Int_Arr[];呢?熟悉typedef的人当然不会有这样的疑问,但总会有写作前一种的嘛(刚好看了简单的实例,就举一反三写作前者)。现在,我们可以用另一种取类型别名的方法,而且不容易出类似的疑问,那就是新标准中出现的using指定别名的方法:

    using Int_Ptr = int *;

    using Int_Arr = int [5];

三、改变个别类成员的访问限制

    C++写类是常态,类设计当然就少不了继承之类的事啦,而继承之后基类成员是否能被派生类对象访问,这又成了一个问题。如果你不知道using可以改变个别类成员的访问权限,出了问题是否是把继承方法改改?还是把成员访问限制改改呢?不管改两者间哪一样,或许都将对封装造成一定影响。此处,我们就来讲讲using改变成员访问限制的方法:

class Base{protected:    int Size;public:    Base() {        Size = 0;    }};class Derived : private Base{public:    Derived() : Base() { }    void Set_Size(int num) {        Size = num;    }    int Get_Size() {        return Size;    }};


 

通过上述代码,我们可以发现,private继承还是public继承都不影响Derived对Size的访问,若我们再将Derived当作基类,再写一个派生类呢?或许此时Base的Size将不再能够访问了。此时,我们可以在Derived中用using将Size的访问限制改一改:

class Base{protected:    int Size;public:    Base() {        Size = 0;    }};class Derived : private Base{protected:    using Base::Size;public:    Derived() : Base() { }    void Set_Size(int num) {        Size = num;    }    int Get_Size() {        return Size;    }};

这样,在Derived中,Size变为了protected成员,再以Derived为基类写派生类时,Size将依旧可以被访问。这样的用法,在SGI STL中可以被找到,大家可以看看。

0 0