c++中using的用法

1、概述

我们用到的库函数基本上都属于命名空间std的,在程序使用的过程中要显示的将这一点标示出来,如std::cout。这个方法比较烦琐,而我们都知道使用using声明则更方便更安全。

这个我们程序员肯定都知道了,今天突发奇想就想对using整理一下。

2、命令空间的using声明

我们在书写模块功能时,为了防止命名冲突会对模块取命名空间,这样子在使用时就需要指定是哪个命名空间,使用using声明,则后面使用就无须前缀了。例如:

using std::cin;//using声明,当我们使用cin时,从命名空间std中获取它int main(){int i;cin >> i;//正确:cin和std::cin含义相同cout << i;//错误:没有对应的using声明,必须使用完整的名字return 0;}12345678

需要注意的是每个名字需要独立的using声明。例如:

using std::cin;//必须每一个都有独立的using声明using std::cout;  using std::endl;//写在同一行也需要独立声明12

位于头文件的代码一般来说不应该使用using声明。因为头文件的内容会拷贝到所有引用它的文件中去,如果头文件里有某个using声明,那么每个使用了该头文件的文件就都会有这个声明,有可能产生名字冲突。

3、在子类中引用基类成员

在子类中对基类成员进行声明,可恢复基类的防控级别。有三点规则:

  1. 在基类中的private成员,不能在派生类中任何地方用using声明。

  2. 在基类中的protected成员,可以在派生类中任何地方用using声明。当在public下声明时,在类定义体外部,可以用派生类对象访问该成员,但不能用基类对象访问该成员;当在protected下声明时,该成员可以被继续派生下去;当在private下声明时,对派生类定义体外部来说,该成员是派生类的私有成员。

  3. 在基类中的public成员,可以在派生类中任何地方用using声明。具体声明后的效果同基类中的protected成员。

例如:

class Base {protected:    void test1() { cout << "test1" << endl; }    void test1(int a) {cout << "test2" << endl; }    int value = 55;}; class Derived : Base //使用默认继承{public:    //using Base::test1;//using只是声明,不参与形参的指定    //using Base::value;    void test2() { cout << "value is " << value << endl; }};12345678910111213141516

我们知道class的默认继承是private,这样子类中是无法访问基类成员的,即test2会编译出错。但是如果我们把上面注释的声明给放开,则没有问题。

注意:using::test1只是声明,不需要形参指定,所以test1的两个重载版本在子类中都可使用。
但是在往下派生,则只能使用无参函数,具体什么原因就不知道了…

4、使用using起别名

相当于传统的typedef起别名。

typedef std::vector<int> intvec;using intvec= std::vector<int>;//这两个写法是等价的12

这个还不是很明显的优势,在来看一个列子:

typedef void (*FP) (int, const std::string&);1

若不是特别熟悉函数指针与typedef,第一眼还是很难指出FP其实是一个别名,代表着的是一个函数指针,而指向的这个函数返回类型是void,接受参数是int, const std::string&。

using FP = void (*) (int, const std::string&);1

这样就很明显了,一看FP就是一个别名。using的写法把别名的名字强制分离到了左边,而把别名指向的放在了右边,比较清晰,可读性比较好。比如:

typedef std::string (Foo::* fooMemFnPtr) (const std::string&);    using fooMemFnPtr = std::string (Foo::*) (const std::string&);123

来看一下模板别名。

template <typename T>using Vec = MyVector<T, MyAlloc<T>>; // usageVec<int> vec;12345

若使用typedef

template <typename T>typedef MyVector<T, MyAlloc<T>> Vec; // usageVec<int> vec;12345

当进行编译的时候,编译器会给出error: a typedef cannot be a template的错误信息。

那么,如果我们想要用typedef做到这一点,需要进行包装一层,如:

template <typename T>struct Vec{  typedef MyVector<T, MyAlloc<T>> type;};// usageVec<int>::type vec;12345678

正如你所看到的,这样是非常不漂亮的。而更糟糕的是,如果你想要把这样的类型用在模板类或者进行参数传递的时候,你需要使用typename强制指定这样的成员为类型,而不是说这样的::type是一个静态成员亦或者其它情况可以满足这样的语法,如:

template <typename T>class Widget{  typename Vec<T>::type vec;};12345

然而,如果是使用using语法的模板别名,你则完全避免了因为::type引起的问题,也就完全不需要typename来指定了。

template <typename T>class Widget{  Vec<T> vec;};12345

一切都会非常的自然,所以于此,模板起别名时推荐using,而非typedef。

(0)

相关推荐

  • C++的引用折叠

    引用折叠:创建引用的引用时(如模板参数.类型别名)会造成引用折叠,折叠规则如下:1.&+&->&&&+&->&&+& ...

  • C模板沉思录(上)

    https://m.toutiao.com/is/JuK5kQU/ 0 论抽象--前言 故事要从一个看起来非常简单的功能开始: 请计算两个数的和. 如果你对Python很熟悉,你一定会觉得:" ...

  • 根管治疗中碘制剂的用法 :

    周佳齐医生: 给自己平时看资料的一个总结,希望都可以用的到. 根管治疗中碘制剂对于残髓的作用: 根管治疗过程中,常遇到残髓不容易清除干净的问题.我的经验是,先用碘酚导入根管,两分钟后用拔髓针试试,多数 ...

  • 古法中“委中”的用法(续)

    点击加载图片 巨灵,与元气齐升,为九元真母 前一篇文章中讲到了委中的古法运用→ 腰痛的分型,委中在治疗腰痛上的作用和禁忌,本文继续引经据典,讲述委中的多种用法,黄贵生老师经常利用夜间打坐前后的空档时间 ...

  • 奇门遁甲知识 | 详解天三门地四户在奇门遁甲中的正确用法与十二月建应用点窍

    奇门遁甲预测中天三门地四户的方法主要是运用于择吉. 天三门是上天的通道,是查天上的事,起运改运用的. 地四户是入地的四条通道,用于查地下的事,阴间的事和过阴的事. 一.天三门 天三门的查法:天三门就是 ...

  • 英语语法:外刊中spend的用法

    ‍‍ 上几期:卫报:疫情期间3000万人在学习数字技能.美国大规模制裁俄罗斯并驱逐外交官.如何思考:你从未学过的一项技能.如何思考:你从未学过的一项技能(2).如何思考:你从未学过的一项技能(3) 关 ...

  • C++ 中 static 的用法静态成员变量

    对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响.例如有两个相同类型的对象 a.b,它们都有一个成员变量 m_name,那么修改 a. ...

  • C++ 中 static 的用法

    在类中,static 除了可以声明静态成员变量,还可以声明静态成员函数.普通成员函数可以访问所有成员(包括成员变量和成员函数),静态成员函数只可以访问静态成员. 编译器在编译一个普通成员函数时,会隐式 ...

  • 字中六合的用法详解, 地支六合如何运用

    地支六合比较复杂,分为合来.合去.合绊,并且还分合吉.合凶,绝非一般的八字命书上说的,看到六合就说好,试想,得病了,是否也是和疾病相合,如何能好,八字中六合的用法详解如下:  1.合来 从字面的意思 ...

  • OpenCV中cv2的用法

    一.读入图像 使用函数cv2.imread(filepath,flags)读入一副图片 filepath:要读入图片的完整路径 flags:读入图片的标志  cv2.IMREAD_COLOR:默认参数 ...

  • VB中Execute的用法

    Public Sub ExecuteX() Dim strsqlChange As String Dim strsqlRestore As String Dim strCnn As String Di ...

  • 英语教学:你需要了解这些英语中的争议用法!

    比尔·布莱森在他的图书<布莱森英语简史>里面提到,英语中目前还存在着不少有争议的用法,但英语也是一门不断发展的语言,随着时间的推移,一些用法会逐渐被大众接受.这里聊一聊一些比较常见的英语争 ...