【C++】C++入门的杂碎知识点

07-09 1595阅读

思维导图大纲:

【C++】C++入门的杂碎知识点 namespac命名空间

  •  什么是namespace命名空间
  • namespace命名空间有什么用

    什么是命名空间 

    namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域中,局部变量存在于局部域中,看下段代码 ,根据已经学习的知识我们都知道局部优先,所以输出会打印局部变量的数据。

    #include 
    // 全局域
    int a = 10;
    int main()
    {
    	// 局部域
    	int a = 0;
    	printf("%d", a);
    }

    由上述代码可以知道,不同的域可以存在相同名称的变量,而输出函数会优先在最近的域中寻找变量a,如果找不到才去全局找。那么有没有一种办法可以绕过局部域,打印全局域的变量a呢,答案是声明我们要打印的变量来源。 

    #include 
    // 全局域
    int a = 10;
    int main()
    {
    	// 局部域
    	int a = 0;
    	printf("%d\n", a);
    	// 在变量名称前加上:: 这样编译器就知道到全局域中寻找了
    	printf("%d\n", ::a);
    }

    通过以上我们大概了解了域方面的知识,那么什么是namespac命名空间呢,简单的说就是一个我们可以自定义的域,在这个域中我们可以存放函数/变量等等,同时因为具有域的特性,我们在多人合作项目时,可以各种取一个命名空间,这样我们可以使用相同命名的函数或者变量了 。

    namespace关键字,后面的ouyang1可以任意取名: 

    #include 
    // 命名空间
    namespace ouyang1
    {
    	int a = 15;
    }
    namespace ouyang2
    {
    	int a = 20;
    }
    int main()
    {
    	printf("%d\n", ouyang1::a);
    	printf("%d\n", ouyang2::a);
    }

    当然在你需要使用什么内部成员时声明一下就可以了 ,以下时使用不同成员声明的代码表述。

    namespace ouyang
    {
    	// 变量
    	int a = 10;
    	// 函数
    	int add(int x, int y)
    	{
    		return x + y;
    	}
    	// 结构体
    	struct student_name
    	{
    		char name[20];
    	};
    	// 枚举
    	enum
    	{
    		red = 1,
    		blue,
    		yellow
    	};
    }
    int main()
    {
    	printf("%d\n", ouyang::a);
    	printf("%d\n", ouyang::add(1, 3));
    	struct ouyang::student_name s1;
    	printf("%d\n", ouyang::red);
    	printf("%d\n", ouyang::blue);
    	printf("%d\n", ouyang::yellow);
    }

     命名空间的作用:

    命名空间可以防止命名冲突的发生,同时每一个命名空间都相当于一个域,访问需要声明获得权限,简单说就相当于我们所划定的领域,这样的设计可以使我们在团队项目中避免冲突发生。

    命名空间的展开: 

    那么我们每次去使用命名空间时,都需要在前声明会不会有点麻烦,为了解决这一问题,c++语法中还包含了命名空间的展开,展开代码如下:

    // 命名空间
    namespace ouyang
    {
    	int a = 10;
    }
    // 命名空间的展开
    using namespace ouyang;

    展开命名空间,就相当于对编译器开放了该命名空间的访问权限,但是注意域的访问顺序还是存在先后的,首先编译器还是会到局部域中去寻找,其次才是全局域和命名空间域。 

    这种展开有好也有坏,好处是:我们可以随意访问命名空间内的成员,坏的一方面如果命名空间展开的成员过多,不可避免会产生命名冲突问题,如以下代码:

    // 命名空间
    namespace ouyang
    {
    	int a = 10;
    }
    // 命名空间的展开
    using namespace ouyang;
    int a = 0;
    int main()
    {
    	printf("%d", a);
    	return 0;
    }

    【C++】C++入门的杂碎知识点 由于展开命名空间后,编译器访问全局域和命名空间域的优先程度一致,所以编译器无法区分究竟因该访问哪一个。

    命名空间的局部展开: 

    为了防止展开太多出现以上情况,c++语法中又提出了局部展开,就是展开到特定的成员,这样可以大大降低了命名冲突带来的报错,也方便快速查找问题。 

    局部展开代码展示: 

    // 命名空间
    namespace ouyang
    {
    	int a = 10;
    	int b = 5;
    }
    // 命名空间的局部展开
    using ouyang::b;
    int main()
    {
    	printf("%d", b);
    	return 0;
    }

     有了局部展开后,我们以后想访问命名空间的谁再去展开,这样既可以优化代码的冗长度,又可以很好的控制使用。

    C++的输入输出

    • cout
    • cin
    • endl

      前提:我们都知道c语言中使用输入输出函数scanf/printf需要包括头文件#include,同样c++语法中使用以上的函数也需要包含头文件#include 。 

      cout输出符 

      上一个知识点我们了解了命名空间,c++在使用头文件时,为了避免命名冲突,也给其中的成员创建了命名空间域用于保护,如我们要使用的输入输出等等的函数都包含着命名空间std中。 

      注意:c++是在c语言的基础上衍生的,所以可以适用c语言的语法 

      代码使用方式: 

      #include 
      #include 
      using namespace std;
      int main()
      {
      	// 变量
      	int a = 10;
      	double b = 13.14;
      	char c = 'a';
      	// c语言的输入输出
      	printf("C语言:");
      	printf("%d %lf %c\n", a, b, c);
      	// c++语言的输入输出
      	// 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]