当前位置: 首页 > news >正文

【C++知识总结1】c++第一篇,简单了解一下命名空间是什么

一、C++的由来

C语言是一种结构化和模块化的编程语言,它对于处理较小规模的程序非常适用。然而,当面临需要高度抽象和建模的复杂问题,以及规模较大的程序时,C语言就显得不那么合适了。为了应对这种挑战,并在解决软件危机的大背景下,计算机科学界在20世纪80年代提出了面向对象编程(OOP)的思想。作为这一思想的体现,一系列支持面向对象的程序设计语言因此应运而生。

二、学习C++只能用一个字总结——难

这里引用网络上一个非常有趣的插图,说明一下笔者对于学习c++的感触:

学习C++的过程,我认为就像是一场惊心动魄的冒险。永远不知道下一秒会出现什么样的错误,也不知道这段代码到底能不能运行。但是,正是这种不确定性,让学习C++的过程充满了挑战和乐趣。

一开始,可能对C++一无所知。看着那些奇怪的符号和关键字,感到十分困惑。但是,我并没有放弃,而是勇敢地开始了对C++的学习之旅。从最基本的语法开始学起,一点一点地了解这个神奇的语言。

随着学习的深入,开始接触到更复杂的概念。学习了指针、数组、类、模板……每一个新概念都让人感到头疼,但是并没有退缩,而是坚持不懈地学习。我知道,每一个困难都是一个挑战,也是一个机会。只有克服了这些困难,才能真正掌握C++。

三、关键字

C++总计63个关键字,C语言32个关键字 。

四、命名空间

1、介绍

在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。为了解决这个问题,C++引入了命名空间(namespace)的概念。命名空间的作用是对标识符的名称进行本地化,以避免命名冲突或名字污染。当多个库或多个模块使用了相同的标识符名时,命名空间可以确保每个标识符在其自己的命名空间内是唯一的,从而避免了冲突。

不妨看看如下的代码及运行结果:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;int main()
{
printf("%d\n", rand);
return 0;
}

编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”。

C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决 。

编译结果如下图 :

2、命名空间的定义

定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}
中即为命名空间的成员。 

// Ting是命名空间的名字,一般开发中是用项目名字做命名空间名。
// 1. 正常的命名空间定义
namespace Ting
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}//2. 命名空间可以嵌套
//test.cpp
namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个
// test.h
namespace N1
{int Mul(int left, int right){return left * right;}
}

一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。

3、命名空间使用

namespace N
{
// 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{printf("%d\n", a);// 编译报错:error C2065: “a”: 未声明的标识符return 0;
}

运行这段代码之后就会有疑问了,上面的代码为什么会报错呢,原因是a是定义在N命名空间中的,后面使用的时候没有指明命名空间的名字,所以a类似于没有被定义。那么如何改就正确了呢,相信看了下面的命名空间的使用方法就一目了然了。

命名空间的使用有三种方式:
加命名空间名称及作用域限定符

int main()
{
   printf("%d\n", N::a);
   return 0;    
}

使用using将命名空间中某个成员引入

using N::b;
int main()
{
   printf("%d\n", N::a);
   printf("%d\n", b);
   return 0;    
}

使用using namespace 命名空间名称引入 

using namespce N;
int main()
{
   printf("%d\n", N::a);
   printf("%d\n", b);
   Add(10, 20);
   return 0;    
}


今天的分享就到这啦😉 

如果我的文章对您有帮助,

请 “点赞” “收藏” “关注” 一键三连哦!

想了解更多知识请前往重生之我在VS写bug

如果以上内容有什么问题,欢迎留言,大家一起学习,共同进步。


http://www.mrgr.cn/news/77878.html

相关文章:

  • cocos creator 3.8 物理碰撞器Collider+刚体RigidBody 8
  • 嵌入式:Flash的分类以及Jlink/J-flash的编程支持
  • 多线程 相关面试集锦
  • Vue 2.6 中使用 Composition Api 笔记
  • 什么是事务?事务有哪些特性?
  • JavaWeb-表单-07
  • Linux: C语言解析域名
  • 使用猴子补丁对pytorch的分布式接口进行插桩
  • 鸿蒙进阶篇-状态管理之@Prop@Link
  • 机器学习周志华学习笔记-第4章<决策树>
  • Android Framework WMS面试题及参考答案
  • YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路
  • 深度优先搜索(dfs)题目合集
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验一(下)----空间数据的编辑与处理(超超超详细!!!)
  • Python 爬虫 (1)基础 | 基础操作
  • 「Mac玩转仓颉内测版30」基础篇10 - 区间类型详解
  • springboot配置https,并使用wss
  • logback动态获取nacos配置
  • Spring 中的 ProxyFactory 创建代理对象
  • 学习Servlet (Servlet的实现方式1)
  • 英语写作中“联系、关联”associate correlate 及associated的用法
  • 28.UE5游戏框架,事件分发器,蓝图接口
  • 17. 指针类型和步长概念问题
  • Node相关教程
  • css效果
  • vue面试题——描述一下vue