C++ primer学习笔记第三章变字符串、向量和数组-using

using

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

using 声明(我们在书写模块功能时,为了防止命名冲突会对模块取命名空间)

using 声明 (using declaration) 是将命名空间中单个名字注入到当前作用域的机制,使得在当前作用域下访问另一个作用域下的成员时无需使用限定符 ::
using 声明将其它 namespace 的成员引入本命名空间的 当前作用域 (包括其嵌套作用域) 。一个 using 声明一次只引入一个命名空间成员,它使得无论程序中使用哪些名字,都非常准确。

#include <iostream>
class Base {
protected:
    int bn1;
    int bn2;
};

class Derived : private Base {
public:
    using Base::bn1;// 使得成员变量bn1变为publick
};

class DerivedAgain : public Derived {
};

int main() {
    Base b;
    Derived d;
    DerivedAgain da;
    b.bn1 = 2;// error, 'bn1' is a private member of 'Base'
    d.bn1 = 1;
    d.bn2 = 2; //error, 'bn2' is a private member of 'Base'
    da.bn1 = 3;  //ok
    std::cout << d.bn1 << std::endl;

    return 0;
}
class Base{
protected:
    int bn1;
    int bn2;
};
 
class Derived: private Base{
public:
    using Base::bn1; // 
};
 
class DerivedAgain: public Derived{
};
 
int main(){
    Derived d;
    DerivedAgain da; 
    d.bn1 = 1;
    d.bn2 = 2; //error, 'bn2' is a private member of 'Base'
    da.bn1 = 3;  //ok
    std::cout<<d.bn1<<std::endl;
 
    return 0;
}

using 指示 (引入命名空间)

using 指示 (using directive) 是使一个命名空间中的 所有 名字都在该作用域中可见的机制。这是最常用的方式了。需要注意的是命名冲突问题。

namespace n1 {
    int n1_member = 10;
    int m = 11;
}

int m = 12;

int main() {
    using namespace n1;
    std::cout << n1_member << std::endl;
    //std::cout<<m<<std::endl;  //error 命名冲突
    std::cout << ::m << std::endl;

    int m = 13; //ok, 局部变量屏蔽命名空间变量
    std::cout << m << std::endl;

    return 0;
}

类型重定义,取代 typedef

using alias = typename

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

头文件

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值