zoukankan      html  css  js  c++  java
  • 教媳妇儿学C++ No.2 | C++中的namespace

    读前福利:几百本互联网技术书籍送给大家https://mp.weixin.qq.com/s/KAYLiHFc5HTPiFD74JYeKQ

    这一个小节主要是说说咱们在代码中的命名问题

    当碰到比较大的项目的时候,不可避免的会包含大量的变量名,进而产生重复命名。那么,C++中提供了一种机制来对变量名进行可见性访问的控制

    一、命名空间的语法

    通常咱们使用的标准命名空间,现在,咱们自己定义一个命名空间

    002-1.cpp

    // 定义命名空间A
    namespace A {
            int a = 10;
    }
    
    // 定义命名空间B
    namespace B{
            int a = 20;
    }
    
    int main()
    {
            cout << "A::a = " << A::a << endl;
            cout << "B::a = " << B::a << endl;
            return EXIT_SUCCESS;
    }
    

    结果展示:

    A::a = 10
    B::a = 20
    

    通过定义不同的命名空间以及其中的变量,可得到不同命名空间下的变量值

    注意:namespace只能在全局定义,不可以使用在函数中定义

    二、命名空间的使用

    2.1 命名空间嵌套命名空间

    可通过嵌套的方式进行变量的访问

    002-2.cpp

    // 定义命名空间A
    namespace A {
    	int a = 10;
    
    	// 嵌套定义命名空间B
    	namespace B{
            	int a = 20;
    	}
    }
    
    
    int main()
    {
    	cout << "A::a = " << A::a << endl;
    	cout << "A::B::a = " << A::B::a << endl;
    	return EXIT_SUCCESS;
    }
    

    结果展示:

    A::a = 10
    A::B::a = 20
    

    2.2 加入新成员到命名空间

    命名空间的开放性,可随时把新的成员加入已有的命名空间中

    002-3.cpp:

    // 定义命名空间A
    namespace A {
            int a = 10;
    }
    
    // 将新成员添加进命名空间A
    namespace A {
            void func (){
                    cout << "hello!命名空间增加新成员!";
            }
    }
    
    int main()
    {
            cout << "A::a = " << A::a << endl;
            A::func();
            return EXIT_SUCCESS;
    }
    

    执行结果:

    A::a = 10
    hello!命名空间增加新成员!
    

    2.3 命名空间中声明和实现的分离

    顾名思义,在命名空间中进行函数的定义,在外面进行具体函数的实现,看代码:

    002-4.cpp

    // 定义命名空间newSpace
    namespace newSpace {
            void func1 ();
            void func2 (int param);
    }
    
    // 在 namespace newSpace 外面进行函数的实现
    void newSpace::func1() {
            cout << "这是第一个在命名空间外实现的函数" << endl;
    }
    void newSpace::func2(int param) {
            cout << "这是第二个在命名空间外实现的函数" << "param = " << param << endl;
    }
    
    int main()
    {
            newSpace::func1();
            newSpace::func2(1024);
            return EXIT_SUCCESS;
    }
    

    执行结果:

    这是第一个在命名空间外实现的函数
    这是第二个在命名空间外实现的函数param = 1024
    

    2.4 无命名空间

    这种情况下,命名空间中的所有标识符只能在本文件内被访问,只能作为内部连接

    002-5.cpp

    namespace {
            int a = 10;
            void func() {
                    cout << "hello namespace!!!" << endl;
            }
    }
    
    int main()
    {
            cout << "a = " << a << endl;
            func();
            return EXIT_SUCCESS;
    }
    

    结果显示:

    a = 10
    hello namespace!!!
    

    但是如果是其他cpp文件使用,是不行的,即使在同一目录下也不行

    2.5 命名空间别名

    使用另外一个变量名进行替代,后续会说到引用,有异曲同工之妙

    002-6.cpp

    // 定义命名空间theLongNameSpace
    namespace theLongNameSpace {
            int a = 10;
            void func()
            {
                    cout << "hello namespace" << endl;
            }
    }
    
    int main()
    {
            namespace shortNameSpace = theLongNameSpace;
            cout << "theLongNameSpace::a = " << theLongNameSpace::a << endl;
            theLongNameSpace::func();
            cout << "shortNameSpace::a = " << shortNameSpace::a << endl;
            shortNameSpace::func();
            return EXIT_SUCCESS;
    }
    

    执行结果:

    theLongNameSpace::a = 10
    hello namespace
    shortNameSpace::a = 10
    hello namespace
    

    三、using的使用

    通过 using spacename的方式进行对我们自己定义的命名空间进行制定

    看下面的例子,通过 using namespace A 从而直接使用命名空间 A 中的成员

    可以通过制定命名空间中内容的方式:

    using A::paramA;
    

    也可以通过直接指定整个的命名空间,但是不建议这样做,很可能会发生变量名或者函数名重复的情况

    using namespace A;
    

    看完整代码和执行结果吧 :

    // 定义命名空间A
    namespace A {
    	int paramA = 20;
    	int paramB = 30;
    	void funcA(){
    		cout << "hello funcA" << endl;
    	}
    	void funcB(){
    		cout << "hello funcA" << endl;
    	}
    }
    
    int main()
    {
    	// 1. 通过命名空间运算符
    	cout << A::paramA << endl;
    	A::funcA();
    	cout << endl;
    
    	// 2. using声明
    	using A::paramA;
    	using A::funcA;
    	cout << paramA << endl;
    	funcA();
    	cout << endl;
    
    	// 3. using声明整个命名空间
    	using namespace A;
    	cout << "paramA = " << paramA << endl;
    	cout << "paramB = " << paramB << endl;
    	funcA();
    	funcB();
    
    	return EXIT_SUCCESS;
    }
    

    执行结果:

    20
    hello funcA
    
    20
    hello funcA
    
    paramA = 20
    paramB = 30
    hello funcA
    hello funcA
    

    代码中的三种使用命名空间的示例,建议使用第一种或者第二种,减少了命名冲突的可能性。第三种直接全局使用,一定会增加命名冲突的可能性。

    四、完整代码获取

    链接: https://pan.baidu.com/s/1DlXRwttcj31xsLwdwNFV8A 密码: hgl6

  • 相关阅读:
    office 2007 验证失败的解决方法
    google开不了(解决办法)
    Mobilenet V1
    Windows10系统下IDECLion的安装与配置
    单目相机成像过程
    C++中如何在函数中返回局部变量的指针/引用/地址?
    ResNeXt论文阅读笔记.md
    Mobilenet V2
    Xception
    InceptionV4
  • 原文地址:https://www.cnblogs.com/johngo/p/14721274.html
Copyright © 2011-2022 走看看