【C++初阶(一)】初识C++&命名空间

03-01 1233阅读

📙作者简介: 清水加冰,目前大二在读,正在学习C/C++、Python、操作系统、数据库等。

📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。

欢迎点赞 👍 收藏 ⭐留言 📝 如有错误还望各路大佬指正!

✨每一次努力都是一种收获,每一次坚持都是一种成长✨       

目录

 ​​​前言

1. 什么是C++

 2. C++的重要性

   2.1 使用广泛

  2.2 应用领域

 3. 命名空间

3.1  什么是命名空间

 3.2 命名空间的使用

 4.C++输入&输出

4.1 输出

4.2 输入

4.3 使用说明

总结


 

【C++初阶(一)】初识C++&命名空间

 

 ​​​前言

        今天正式开始C++的学习,C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式等。熟悉C语言之后,对C++学习有一定的帮助。


1. 什么是C++

         C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(面向对象)思想,支持面向对象的程序设计语言应运而生。

        C++是一种通用的、高级的编程语言,它是C语言的扩展和增强版本。C++在C语言的基础上引入了面向对象编程的概念,提供了更多的功能和特性,使得程序员能够更加方便地编写复杂的程序。

 2. C++的重要性

   2.1 使用广泛

 下图数据来自TIOBE编程语言社区2023年10月最新的排行榜,在30多年的发展中,C/C++几乎一

致稳居前5

 ​​​​​​​【C++初阶(一)】初识C++&命名空间

注意:排名不能说明哪个语言好,哪个不好,每门编程语言都有适应自己的应用场景。 

  2.2 应用领域

  1. 操作系统以及大型系统软件开发
  2. 服务器端开发
  3. 游戏开发
  4. 嵌入式和物联网领域
  5. 数字图像处理
  6. 人工智能
  7. 分布式应用

 作为一名老牌语言的常青树,C++一直霸占编程语言前5名,肯定有其存在的价值。

 3. 命名空间

        我们在日常应用中,一个较大项目一般都是分多文件进行管理,在引用其他文件时就可能会造成命名冲突的问题。例如:

【C++初阶(一)】初识C++&命名空间

         在stdlib.h中定义了rand函数,我们在包含stdlib.h文件后,再次新建一个命名为rand的变量,运行程序时,编译器分不清要使用的是哪个rand(变量名与库函数冲突),于是就产生了了命名冲突。C语言没办法解决类似这样的命名冲突问题,为了解决上述的问题,C++就提出了命名空间来解决

3.1  什么是命名空间

         命名空间(Namespace)是C++中用来避免命名冲突的一种机制。在C++中,我们可以将一些变量、函数、类等封装在一个命名空间中,从而避免与其他代码中的同名变量、函数、类等发生冲突。

比如: 

namespace Q 
{
	int rand = 0;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		int* data;
		int size;
	};
}

 注意:命名空间可以嵌套

这些声明的作用域仅限于该命名空间中。在其他代码中,如果想要使用该命名空间中的变量、函数、类等,需要在前面加上命名空间的名称(默认情况下,程序不会在命名空间里去找)。

 3.2 命名空间的使用

  • 使用域作用限定符
    int main()
    {
    	printf("%d\n", Q::rand);//命名空间名::限定变量
        
    	struct Q::Node node;//注意当指定元素时不能指定在struct前边,要在结构体名Node前
        //注意不是struct在空间里边,而是Node在空间里
    	Q::Node node1;//或者使用重命名这样写
    	return 0;
    }
    • 嵌套使用

      在一个命名空间里边如果定义两个同名的变量怎么解决?

      也很简单,我们可以在嵌套一个。比如: 

      namespace Q
      {
      	namespace Q1
      	{
      		int rand = 666;
      	}
      	int rand = 0;
      	
      }
      int main()
      {
      	printf("%d\n", Q::rand);
      	printf("%d\n", Q::Q1::rand);
      	return 0;
      }
      •  声明和定义分离

        在写代码时我们也会经常遇到这种情况

        如果声明和变量分离,要把哪个写在命名空间里边?答案是两个都写。

        比如:

        //fun.h
        #pragma once
        #include
        namespace Q
        {
        	typedef struct Stack
        	{
        		int* data;
        		int size;
        		int capacity;
        	}ST;
        	void InitStack(ST* ps);
        	void pushStack(ST* ps, int a);
        }
        //fun.c
        #include"Func.h"
        namespace Q
        {
        	void InitStack(ST* ps)
        	{
        		ps->data = NULL;
        		ps->size = 0;
        		ps->capacity = 0;
        	}
        	void pushStack(ST* ps, int a)
        	{
        		//…
        	}
        }
        

         它们的命名空间可以同名,在代码编译时编译器会将多个同名的命名空间合并成一个。

        •  展开命名空间

           有了这个命名空间可以解决命名冲突的问题,但在大量调用命名空间里的内容时就有点麻烦了,比如:

          int main()
          {
          	Q::ST s;
          	int a = 0;
          	Q::InitStack(&s);
          	Q::pushStack(&s, 1);
          	Q::pushStack(&s, 2);
          	Q::pushStack(&s, 3);
          	Q::pushStack(&s, 4);
          	Q::pushStack(&s, 5);
          }

           每次都要加限定符,为了解决这个问题,这时我们可以默认使用这个命名空间(展开命名空间),我们可以加上这行代码:

          using namespace Q;

           这也是我们在写C++第一个程序:Hello,world!;时为什么要有using namespace std;的原因,std就是C++的官方库定义的命名空间,展开之后就可以随意使用C++库里的函数。

          注意:展开命名空间虽然方便,但也不是在任何情况下都可以展开的,在一些大型项目中不要展开std,容易冲突。我们日常写代码练习时,为了方便,可以展开。

          •  展开命名空间里的元素

             我们在使用时为了防止展开命名空间引起冲突,又不想一种限定使用怎么办?

            这时我们就可以选择展开命名空间里的个别元素,比如:

            using std cout;
            using std endl;
            int main()
            {
            	cout 
VPS购买请点击我

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

目录[+]