二、C++对C的扩展

一、双冒号作用域运算符

// :: 双冒号, 作用域运算符, 全局作用域

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>    
using namespace std;

int atk = 200;
void test01()
{
    int atk = 100;
    cout << "攻击力为" << atk << endl;    // 攻击力为100
    // :: 双冒号, 作用域运算符, 全局作用域
    cout << "攻击力为" << ::atk << endl;  // 攻击力为200
}
int main()
{

    test01();
    return EXIT_SUCCESS;
}

二、namespace的使用

// game1.h
#include<iostream>
using namespace std;

namespace LOL
{
    void goAtk();
}

// game1.cpp
#include "game1.h"

void LOL::goAtk()
{
    cout << "LOL的攻击实现" << endl;
}
// game2.h
#include<iostream>
using namespace std;
namespace KingGlory
{
    void goAtk();
}


// game2.cpp
#include "game2.h"

void KingGlory::goAtk()
{
    cout << "王者荣耀的攻击实现" << endl;
}
/*
namespace 命名空间主要用途: 用来解决命名冲突的问题
    1. 命名空间下,可以放函数、变量、结构体、类
    2. 命名空间必须定义在全局变量下
    3. 命名空间可以嵌套命名空间
    4. 命名空间是开放的,可以随时往命名空间中添加内容
    5. 匿名命名空间
    6. 命名空间可以起别名
*/

#define _CRT_SECURE_NO_WARNINGS 1

#include "game1.h"
#include "game2.h"

void test01()
{
    LOL::goAtk();          // LOL的攻击实现
    KingGlory::goAtk();    // 王者荣耀的攻击实现
}

// namespace 命名空间主要用途: 用来解决命名冲突的问题

// 1. 命名空间下,可以放函数、变量、结构体、类
namespace A
{
    void func();
    int a = 10;
    struct Animal1
    {
    };
    class Animal2
    {
    };
    namespace B
    {
        int a = 20;
    }
}
// 2. 命名空间必须定义在全局变量下
// 3. 命名空间可以嵌套命名空间
// 4. 命名空间是开放的,可以随时往命名空间中添加内容

namespace A  // 此命名空间会与上面的命名空间A合并
{
    int b = 15;
}

void test02()
{
    cout << "作用域A下面的a是" << A::a << "  作用域A下面的b是" << A::b << endl;  // 10, 15
}

// 5. 匿名命名空间
namespace
{
    int c = 0;
    int d = 1;
}
// 当写了匿名命名空间相当于写了 static c; static d; 只能在当前文件中使用

// 6. 命名空间可以起别名
namespace veryLongName
{
    int e = 2;
}

void test03()
{
    namespace veryShortName = veryLongName;
    cout << veryLongName::e << endl;   // 2
    cout << veryShortName::e << endl;  // 2
}

int main()
{
    cout <<"作用域B下面的a是 "<< A::B::a << endl;  // 20
    test01();
    test02();
    cout << c << endl;  // 0
    test03();
    return EXIT_SUCCESS;              
}

三、using声明和using翻译指令

3.1 using声明

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>    
using namespace std; 

namespace KingGloary
{
    int sunwukong = 10;
}

// using声明
void test01()
{
    int sunwukong = 20;
    // using声明要注意 二义性
    // using 声明 写了using声明后,下面这样代码说明以后看到的 sunwukong使用 KingGloary下的
    // 但是编译器又有就近原则,此时出现了 二义性 ,所以下面这样会报错的
    // using KingGloary::sunwukong;
    cout << sunwukong << endl;  // 20
}

int main()
{
    
    test01();
    return EXIT_SUCCESS;              
}

3.2 using翻译指令

#define _CRT_SECURE_NO_WARNINGS 1

#include<iostream>    
using namespace std; 

namespace KingGloary
{
    int sunwukong = 10;
}

// using 编译指令
void test02()
{
    int sunwukong = 30;
    // using 翻译指令
    using namespace KingGloary;
    cout << sunwukong << endl;  // 10
}

namespace LOL
{
    int sunwukong = 40;
}
void test03()
{
    // using 翻译指令
    using namespace KingGloary;
    using namespace LOL;
    // cout << sunwukong << endl; 报错。 如果打开了多个空间,也要避免二义性
    
    cout << LOL::sunwukong << endl;  // 40
}

int main()
{
    test02();
    test03();
    return EXIT_SUCCESS;              
}

 

posted on 2022-01-15 17:08  软饭攻城狮  阅读(53)  评论(0编辑  收藏  举报

导航