1. 引入命名空间

C++ Primer 5th (3.1.5 P74)

using namespace std;  //将整个命名空间引入到当前作用域
using std::cout;      //将某个某个成员引入到当前作用域

在局部作用域中使用 using,C++ Primer-5th(13.3, P459)

void swap(Foo &lhs, Foo &rhs)
{
    using std::swap;
    swap(lhs.h, rhs.h);  // lhs.h, rhs.h 是 HasPtr 类型
}

这里 swap(lhs.h, rhs.h); 并没有调用标准库中的 swap,而是调用了自定义的 void swap(HasPtr& &lhs, HasPtr &rhs) 。 引入标准库中的 swap 没有隐藏自定义的 swap ,而是和自定义的构成了重载关系。

2. 类型别名

C++ Primer 5th (2.5.1 P60)

C++11 新标准可以使用 using 关键字声明类型别名,和 #definetypedef 功能类似,但更加直观

#include <iostream>
using namespace std;

#define DString std::string    //! 不建议使用!

typedef std::string TString;   //! 使用typedef的方式
using Ustring = std::string;   //!使用  using typeName_self = stdtypename;

//更直观
typedef void (tFunc*)(void);
using uFunc = void(*)(void);

int main(int argc, char *argv[])
{

    TString ts("String!");
    Ustring us("Ustring!");    
    string s("sdfdfsd");
    
    cout<<ts<<endl;
    cout<<us<<endl;
    cout<<s<<endl;
    
    return 0;
}

3. 在继承中,改变父类成员的访问权限

C++ Primer 5th (15.5 P542)

在继承中访问权限遵循下面图示中的原则

img

以公有继承为例,在继承类中可以使用 using 关键字改变基类的访问权限

class Base
{
public:
    void pub_mem();
protected:
    int prot_mem;
private:
    char priv_mem;
};

class Derved : public Base
{
 public:
    using Base:: prot_mem;   // 基类 prot_mem 成员访问权限变为 public 
 private:
    using Base::pub_mem;      // 基类 pub_mem 成员访问权限变为 private 
};

int main()
{
    Base base;
    Derved der;
    
    base.pub_mem();		// 使用基类对象访问成员的权限不会变
    
    der.pub_mem();		// 错误 继承类中改变了基类成员的访问权限,private
    der.prot_mem = 42;  // 正确 继承类中改变了基类成员的访问权限, public
	
    return 0;
}

使用 using 声明语句将父类的成员声明在继承类中,其访问权限由该声明语句之前的访问说明符决定的。

所以一个类如果是可以被继承的(没有使用 final 防止继承),在继承类中可以将一些(继承类可以访问的名字)基类的成员暴露给用户。