using五大用法

摘要:
1.命名空间usingsnamespace//这样,每次在命名空间中使用变量时都不需要指定命名空间。注意:头文件中不应有使用命名空间的声明。2.类型别名(C++11)usingaa=double//等同于typedefdoubleaatypedefdouble Db,*p//Db与double同义,p与double*同义(注意)3.更改从基类classbas继承的成员的访问级别

1.命名空间

using namespace 命名空间;//这样每次使用命名空间中的变量时就不用指定命名空间了

注意:头文件中不应有using命名空间的声明

2.类型别名(C++11)

using aa = double;//等价于typedef double aa
typedef double db, *p;//db是double的同义词,p是double*的同义词(注意)

3.改变从基类继承来的成员的访问级别

class base {
public:
    int fun(int x);
    int b;
};

class son : private base {
public:
    using base::fun;    //fun(int x)由private变成public(注意:using不指定参数列表)
protected:
    using base::b;    //b由public变成protected
};

4.让派生类对基类中所有的重载函数都可见,而不是隐藏

class base {
public:
    void func()
    {
        cout << "func1()" << endl;
    }
    void func(int x)
    {
        cout << "func2()" << endl;
    }
};

class son : public base {
public:
    using base::func;    //若没有此句,func()和func(int x)将会被隐藏
    void func(int x, int y)
    {
        cout << "func()3" << endl;
    }
};

5.第4点的升级,using可让派生类继承直接基类所有的构造函数

1)派生类并非以常规方式继承基类的构造函数,而是要使用using声明让派生类继承基类的所有的(有两个例外)构造函数

2)例外一:派生类自己的构造函数与基类的某个构造函数有相同的形参,则该构造函数不会被继承

      例外二:默认、拷贝和移动构造函数不会被继承

3)与第3点不同,using声明不会改变继承的构造函数的访问级别:不管using声明出现在哪,基类的共有/受保护/私有构造函数在派生类中还是一个共有/受保护/私有构造函数,

4)using声明不能指定explicit和constexpr:如果基类的构造函数是explicit或constexpr,则继承的构造函数也拥有相同的属性

5)继承的构造函数不算自定义的构造函数,所以仍然可以满足合成构造函数的生成规则

6)如果基类的构造函数有默认实参,则实默认参不会被继承

7)如果基类的构造函数有两个形参,一个形参没有默认实参,另一个形参有默认实参,则通过继承会获得两个构造函数:一个构造函数有两个形参,另一个只有一个形参(对应没有默认实参的那个),总之,默认实参都不会被继承

class base {
public:
    base() {}
    base(string s, int a) {}
};

class son : public base {
public:
    using base::base;//继承直接基类所有的构造函数,对于基类的每个构造函数,编译器都在派生类中生成一个形参完全相同的构造函数
  //using不能指定explicit和constexpr
private: //使用继承来的构造函数时,如果派生类有自己的数据成员,则这些成员将被默认初始化 string str; int num; }; //等价于: class son : public base { public: son():base() {} son(string s, int a): base(s, a) {} };

免责声明:文章转载自《using五大用法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇手机上移动梦网中毒啦!病毒名字叫:程序管理 版本0.1.1 defwatch!找到删除它的简单方法!IOS 特定于设备的开发:Core Motion基础下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

11-C#反射机制

C#反射机制 转自:http://blog.csdn.net/educast/article/details/2894892 反射的用途:    (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。     (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所...

XPO 学习资料(转摘)

Dev 出品的XPO是一个O/R Mapping框架,虽然是商业软件,非开源,但提供了源码。况且Dev的产品一向以精品为主,值得好好研究一下(我不是Dev的代理)。 于是在学习过程中做个摘要。   一、一个持久类(Persistent Class)一般来说映射为一个表类型,该表的每一条纪录即一个持久类的实例。 持久类继承自XPObject或者XPBaseO...

初识依赖注入(DI)

Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系。 1、基于构造函数的DI,当容器调用带有一组参数的类构造函数时,基于构造函数的 DI 就完成了,其中每个参数代表一个对其他类的依赖。 (1)A 不应该担心 B 的实现。B 将会独立实现,并且在 A 实例化的时候将提供给 A,整个过程是由 Spring 框架的控制。 (2)....

CodeDomProvider 生成代码

CodeDom是.net提供源代码生成器,他可以通过CodeDomProvider来生成源代码,因为CodeDomProvider是CSharpCodeProvider、VBCodeProvider的抽象基类,表示CodeDomProvider是跨语言的源代码生成器,只需要提供相应的CodeProvider就可以生成相应的语言的源代码。 CodeDom在...

Java中类加载过程和对象创建过程

类加载过程: 1, JVM会先去方法区中找有没有相应类的.class存在。如果有,就直接使用;如果没有,则把相关类的.class加载到方法区 2, 在.class加载到方法区时,会分为两部分加载:先加载非静态内容,再加载静态内容 3, 加载非静态内容:把.class中的所有非静态内容加载到方法区下的非静态区域内 4, 加载静态内容:     4.1、把.c...

C#调试器导航

本快速入门演示如何在 Visual Studio 调试会话中导航,以及如何在会话中查看和更改程序状态。 本 快速入门适用于不熟悉用 Visual Studio 进行调试的开发人员,以及要详细了解在 Visual Studio 调试会话中导航的开发人员。但其中不传授调试本身的技艺。示例代码中的方法仅为演示本主题中所述的调试过程。这些方法并未采用应用程序或函...