一起学习交流~

c/c++细节知识点 08范围解析运算符与using的使用

c++面试准备 laomuji 1个月前 (08-17) 92次浏览 已收录 0个评论

目录

作用

/*
::范围解析运算符,一般分三类
::name 用于使用全局的命名空间(匿名命名空间)的某个成员,多个匿名命名空间会被视为同一个,可以互相调用
namespace::name 用于某个命名空间的某个成员
classname::name 用于使用某个类的成员

常用情况1
命名空间相当于定义了一个代码块,用于解决命名冲突问题
using 声明使用命名空间的某个指定内容
using namespace 声明使用整个命名空间的内容

常用情况2(c++11) 
定义别名,类似于typedef,但是更易读
为模板进行别名,解决typedef无法为模板重定义的问题

常用情况3(c++11)
派生类使用父类的成员函数,解决派生类重定义基类的函数的重载问题
*/

用法

/*
基本用法
*/
#include<iostream>
namespace Namespace8_1_1 {
    int num1;
    char ch1;
};
namespace Namespace8_1_2 {
    int num2;
    char ch2;
};
namespace Namespace8_1_3 {
    int num3;
    char ch3;
};
namespace {
    int num8_a;
};
namespace {
    int num8_b;
    void showNum8_a() {
        std::cout << num8_a << std::endl;
    }
};
int main8_1() {
    ::num8_a = 123;//使用全局命名空间(匿名命名空间)
    ::num8_b = 321;
    ::showNum8_a();

    Namespace8_1_1::num1 = 123;//命名空间名称::成员名
    //num1 = 123;//并没有using,所以无法使用

    using Namespace8_1_2::num2;//仅使用num2变量
    num2 = 321;//using了num2,所以num2可见
    //ch2 = 'a';//ch2不可见

    using namespace Namespace8_1_3;//使用整个命名空间,命名空间下的所有成员都可见
    num3 = 222;
    ch3 = 'c';

    return 0;
}

/*
和typedef类似,但要比typedef更容易读
*/
#include<vector>
//一般用法与typedef相同
using vecInt1 = std::vector<int>;
typedef std::vector<int> vecInt2;

//函数指针的用法,更容易读懂
int func8_2_add(int a,int b) {return a + b;}
int func8_2_sub(int a, int b) { return a - b; }
using func8_2_p1 = int(*)(int, int);
typedef int(*func8_2)(int, int);

//using对模板进行别名
//假设 需要定义一个 map
//需要以int类型为key,其它任意类型为value
//使用typedef无法对模板别名,但在c++11中增加了using对模板的别名
#include<map>
using std::map;
template<typename T>
using t8_2_1 = map<int, T>;
//typedef map<int, T> t8_2_2; //此处不能指定typedef

int main8_2() {
    func8_2_p1 f1 = func8_2_add;
    std::cout << f1(123, 312) << std::endl;
    func8_2 f2 = func8_2_sub;
    std::cout << f2(321, 123) << std::endl;
    t8_2_1<double> t;
    t[123] = 123.312;
    std::cout << t[123] << std::endl;
    return 0;
}

/*
如果派生类对基类的函数进行了重载,无论参数列表是否相同,都会隐藏基类中的同名函数
使用using 可以引用基类同名函数 达到不被隐藏的功能
*/

class Class8_3_A {
public:
    void prt() {
        std::cout << "Class8_3_A : 未输入数据" << std::endl;
    }
    void prt(int num) {
        std::cout << "Class8_3_A : " << num << std::endl;
    }
protected:
    int a;
};

class Class8_3_B : public Class8_3_A {
public:
    using Class8_3_A::prt;//引用基类中的函数,如果不引用,下方编译报错
    using Class8_3_A::a;//改变基类中的成员作用域

    void prt() {
        std::cout << "Class8_3_B : 未输入数据" << std::endl;
    }
};

int main8_3() {
    Class8_3_B b;
    b.a = 123;
    b.prt();
    b.prt(666);//不引用基类的函数,则基类中的同名函数全部被隐藏
    return 0;
}
喜欢 (0)
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论