C++基础知识-----命名空间
本期开始我们来对C++进行学习
目录
1.C++关键字
2.命名空间
3.C++的输入与输出
1.C++关键字
C++总计63个关键字,C语言32个关键字
asm | do | if | return | try | continue |
auto | double | inline | short | typedef | for |
bool | dynamic_cast | int | signed | typeid | public |
break | else | long | sizeof | typename | throw |
case | enum | mutable | static | union | wchar_t |
catch | explicit | namespace | static_cast | unsigned | default |
char | export | new | struct | using | friend |
class | extern | operator | switch | virtual | register |
const | false | private | template | void | true |
const_cast | float | protected | this | volatile | while |
delete | goto |
reinterpret_cast |
我们并不需要刻意的去记住这些关键字,在后续使用中我们就会慢慢熟悉他们
2.命名空间
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的
#include<stdio.h>
#include<stdlib.h>int rand = 10;
int main() {printf("%d\n", rand);return 0;
}
我们在编译这一段代码时,会出现错误,在C语言中,并不会出现这种错误,但是在C++中却会报错
我们来看这段错误,是重定义,即我们定义的rand和库中的一个rand函数冲突,所以在C语言中,是存在命名冲突的
命名冲突主要包含两方面,一方面是我们和库冲突,所以在使用C语言写一些大型项目时会出现这样的问题,在我们引入某个库后会出现一堆报错,因为我们定义的变量或者函数和库里的冲突了,另一方面是我们互相之间冲突,比如两个人写一个项目,一个人定义了一个了一个变量a,另一个人也定义了一个变量a,最后两个代码是会合并的,而合并时就会出现冲突,此时就需要一个人来改变变量名,如果将这个变量使用了成百上千遍,那就非常麻烦了
为了解决这个问题,C++引入了命名空间
我们在网络上看C++代码时,经常能看到这样一段代码
#include<iostream>
using namespace std;
第二行的代码是什么意思呢?我们先将这个问题保留,一会回过头来看
为了使程序不冲突,我们使用域来进行隔离
#include<stdio.h>
#include<stdlib.h>
//域
namespace hello {int rand = 10;
}int main() {printf("%d\n", rand);return 0;
}
我们先看这段代码
#include<stdio.h>
#include<stdlib.h>int a = 0;
int main() {int a = 10;printf("%d", a);return 0;
}
我们知道,这两个a是可以同时存在的,main函数里的a是局部变量,也就是在局部域,而外部的a是全局变量,也就是在全局域,我们知道,运行这段代码,会输出10
如果我们想要访问全局的a,该如何访问呢?
在C++里,我们可以使用::来进行访问,:: 叫做域作用限定符,局部域和全局域,是优先在局部搜索,没有局部才在全局搜索,::的左边什么也没有(加上空白是为了好看)
我们再看这样一段代码
#include<stdio.h>
#include<stdlib.h>int a = 0;
namespace hello {int a = 10;
}
int main() {int a = 20;return 0;
}
这3个a我们该如何访问呢?
如果我们直接进行访问,访问的是局部的a
如果局部不存在,接下面就是全局搜索了 ,而命名空间域里的变量,不指定是不会去搜索的
如果想要访问命名空间域,有两种操作,一种是展开命名空间域,另一种是指定访问命名空间域
所以using namespace是展开命名空间域,此时我们回过头来看using namespace std;
这段代码的意思就是展开命名空间域,而这个std是标准库的命名空间
那如果我们想要同时访问3个a呢?
这个操作就是指定访问命名空间域,::前面什么都不加,就是访问全局域
我们再看这种情况,展开的本意就是暴露到全局,所以是会报错的
此时就不知道你需要访问哪一个了
所以我们不要轻易展开命名空间,展开是编译时是否去命名空间中搜索,没有展开就不会去搜索
我们再回过头来解决rand的问题,我们只需指定访问即可解决
命名空间除了定义变量,还可以定义函数,定义类型,唯一要注意的是命名空间最后的 } 后是没有 ; 的
命名空间也是可以嵌套的
namespace n1
{int a = 10;;int b;int add(int left, int right){return left + right;}namespace n2{int a = 20;int c;int d;int sub(int left, int right){return left - right;}}
}
命名空间过大时,为了防止冲突时就需要使用嵌套分割
嵌套的命名空间我们需要访问时要进行如下操作
多个同名的命名空间是会被合并的
这里我定义了两个头文件
在每个头文件里都定义了hello的命名空间
我们在test.c里可以对这三个命名空间里数据进行访问,这三个命名空间合并成了一个命名空间
C++里有STL库,每个库都有命名空间,最后也合并在一起,就是这样使用的
下面,我们回过头来看这句代码
#include<iostream>
我们发现c语言的头文件都是xxx.h,而c++不是.h,为什么呢?
其实在早年的时候,是有#include<iostream.h>的,但是现在只能在很老的编译器下使用,这个头文件是没有命名空间的,但是C++后面有了命名空间后,很多库都用了命名空间,,而且有时候会和C有冲突,比如C的string.h,在C++里也有string,所以C++标准库就直接把.h去掉了
C++的iostream库里有一个cout,这个类似C里面的printf,但是我们发现这里报错了,原因就是我们上面说的,如果我们不指定访问或者展开命名空间,就不会去主动搜索
我们的一种解决办法为让他直接去命名空间搜索
但是这样写我们每次都要加std::,是非常麻烦的
第二种办法就是我们展开命名空间
另外,我们展开不展开都是可以加std::的,一般是推荐使用第一种方法
我们展开的话是要去std里搜索,但前提是上面有std,如果没有的话也是不行的 ,不加是不会搜索的
但是用using namespace std;全部展开是有风险的,如果我们和库有冲突,就会报错
所以我们建议项目里面不要展开,在项目里我们用指定访问,不要轻易展开
我们使用这种办法,展开常用的即可
3.C++的输入与输出
我们在上面使用了cout,这是一个全局对象
我们发现cout << "hello " << endl;
<<在C里面叫做移位运算符,在C++里叫做流插入运算符,并且可以支持多个值输出
我们输出了字符串hello world,输出了10,\n是换行,endl也是换行,endl也是全局的
cout相比于printf,真的强大的地方在于自动识别类型,我们使用printf需要指定%d,%f等等,而cout不需要指定类型
既然有cout,与之对应的还有cin,这个类似scanf
>>叫做流提取运算符
这几个可以混着用,大家怎么舒服怎么来就行
以上即为本期全部内容,希望大家可以有所收获
如有错误,还请指正
C++基础知识-----命名空间相关推荐
- C++基础知识(二)命名空间
前面总结了C++中的键盘输入,经过一段时间的学习,终于基本上把C++的基础知识都预热了一遍.今天再做一个总结. C++比C中多了一个命名空间,即用关键字namespace声明,为什么要使用命名空间呢. ...
- 【贪玩巴斯】Unity初学圣经Part2-C#基础——Day 01:C#基础之——命名空间、类、方法、变量的声明赋值和相关知识以及.NETC#关系讲解 2022年3月28日
C#基础之--命名空间.类.方法.变量的声明赋值和相关知识以及.NETC#关系讲解 对应视频4-1至4-7 1.引入命名空间: 2.引入类.方法 3.变量的声明赋值 4.综合小练习 5. .NET的介 ...
- ue4 函数和宏区别_【UE4】通俗易懂 用蓝图来学习 C++ 基础知识
[前言]: 用老罗来学UE蓝图: https://zhuanlan.zhihu.com/p/135297007zhuanlan.zhihu.com 再开个脑洞,用蓝图来类比学习C++基础知识. C+ ...
- 记录由Equal基础知识引起的内存泄露
在最近的公司框架开发中,利用了网上某大牛的反射缓存库作为辅助.在测试的时候发现出现了巨大的内存泄露,在频繁的操作后,内存不断的产生巨大的开销,10多分钟就占有了5,6m的内存.解决问题的时,公司不能上 ...
- [C#基础知识系列]专题十七:深入理解动态类型
本专题概要: 动态类型介绍 为什么需要动态类型 动态类型的使用 动态类型背后的故事 动态类型的约束 实现动态行为 总结 引言: 终于迎来了我们C# 4中特性了,C# 4主要有两方面的改善--Com 互 ...
- 九. Python基础(9)--命名空间, 作用域
九. Python基础(9)--命名空间, 作用域 1 ● !a 与 not a 注意, C/C++可以用if !a表示if a == 0, 但是Python中只能用if not a来表示同样的意义. ...
- python基础知识资料-python基础知识整理(值得收藏)
近些年python语言非常流行,许多开发者都会学习一些python相关知识,本文为大家整理了python的一些基础知识,希望对大家有一定的帮助. 注:下文Python代指Python3. 基本信息和J ...
- python笔记基础-Python入门基础知识学习笔记之一
为什么要写这篇文章? 本人做过Objective-C开发,现在在用C#做WinForm开发.近段时间在学习Python入门基础知识时,发现有很多知识点和Objective-C的不一样.故想通过本文记录 ...
- 你得学会并且学得会的Socket编程基础知识
这一篇文章,我将图文并茂地介绍Socket编程的基础知识,我相信,如果你按照步骤做完实验,一定可以对Socket编程有更好地理解. 本文源代码,可以通过这里下载 http://files.cnblog ...
最新文章
- 测试函数: Ackely,Rastrigin,Griewangk,SumSquartes,Sphere,Quartic,Schwefel' Problem 12等
- Notepad++ 更改和定制主题
- 书写是为了更好的思考
- MSB6006: “cmd.exe”已退出,代码为 3.
- java oscache 使用_OScache的使用(Java对象)
- 翻转句子中单词的顺序
- webstorm的安装
- 中国架构师,名符其实有多少?
- 写一个类Army,代表一支军队,这个类有一个属性Weapon数组w(用来存储该军队所拥有的所有武器), 该类还提供一个构造方法,在构造方法里通过传一个int类型的参数来限定该类所能拥有
- 手把手教你启动若依单体项目
- 第二章节 ASP.NET 验证控件(一)
- 蓝桥杯集训之STL和algorithm
- 三星app图标不见了怎么恢复_手机便签的内容不见了怎么恢复?试试这款便签软件的时间轴功能...
- 计算机电子电路原理图,电路图讲解 电路图基础知识【图】
- 电影天堂python分页爬取
- 各种音频线的阻抗(数字音频线,模拟音频线,麦克音频线,拖拽音频线)
- Docker中Swarm集群部署
- 堪称神器的Chrome插件
- DDD - 六边形架构和CQRS架构
- oracle 测试坚挺,Oracle RMAN测试
热门文章
- 总结:堡垒机和跳板机
- 阿里云王牌架构师杨曦:也谈系统缓存设计误区及高阶使用技巧
- git push提示dst refspec XXX matches more than one
- 1064: [Noi2008]假面舞会
- 20 21九死一生、22上半年读20本书(含15本管理书单/笔记):继续百年征程
- java 实现图片旋转_java实现图片旋转
- 人工智能工程师的三个层次
- 【目标检测论文阅读笔记】QueryDet: Cascaded Sparse Query for Accelerating High-Resolution Small Object Detection
- 大白映射 宝马Esys编程设码映射、USB设备映射
- 微信小程序授权_微信小程序授权验证码什么意思