前言
这篇文章是C++的第一篇文章,主要是补充C语言中存在的不足而扩展的一些新的语法,有了这篇文章作为杂序,后面再介绍其他内容就要清晰地多
C++:入门篇
一、namespace 命名空间(一)域的概念(二)命名空间的使用1、创建命名空间域2、命名空间域的嵌套使用3、using 关键字 二、缺省参数三、函数重载四、引用(一)引用的使用(二)const 引用1、变量的权限不能放大2、指针的权限不能放大3、临时对象 (三)引用和指针的区别 五、inline 关键字(一)宏的不足(二)inline 的用法 六、nullptr 关键字(一)C语言中的NULL(二)nullptr 关键字结束语
一、namespace 命名空间
在全局区中,c++可能定义有变量、函数、类,而太多的变量定义可能会导致重定义的问题,尤其是小组中多人在进行代码合并时候,往往容易导致错误。我们引入namespace 命名空间关键字。
下面的代码说明在头文件中已经有了 rand 函数了,我们以这个函数名作为变量名必定会产生冲突。
(一)域的概念
1、C++中域有函数局部域,全局域,命名空间域,类域。
2、域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,有了域隔离,名字冲突就解决了。
3、局部域和全局域除了会影响编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
(二)命名空间的使用
1、namespace 只能定义在全局,当然他还可以嵌套定义。
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫==std(standard)==的命名空间中
1、创建命名空间域
这里我们创建了一个命名空间域,因此 rand 变量依旧可以创建在全局区
在访问命名空间域中的变量时必须标注域的名字。(后面学的类域也是相似)
2、命名空间域的嵌套使用
这种用法一般是用来解决两个程序员合并代码时候的问题,假如A, B两人都想使用 rand 来作为全局变量,可以用下面的方式
3、using 关键字
命名空间域中我们要访问函数或者变量时太麻烦了,有没有办法可以使得我们不加前面的 :: 呢
半放式 : 将命名空间中不与其他全局变量重名的放回全局区
全放式: 将命名空间的成员全部放在全局区中,但是容易造成错误。因此在项目中不推荐使用 using namesapce std;
二、缺省参数
缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。
三、函数重载
C++⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数参数个数不同或者类型不同。这个就叫函数重载。
参数类型不同
参数个数不同
参数顺序不同
参数返回值不同
存在歧义
四、引用
类型& 引⽤别名 = 引⽤对象;
引⽤不是新定义⼀个变量,⽽是给已存在变量取了⼀个别名,编译器不会为引⽤变量开辟内存空间,它和它引⽤的变量共⽤同⼀块内存空间。
引⽤在定义时必须初始化,引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体
(一)引用的使用
引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被
引⽤对象
(二)const 引用
核心是权限不能放大
1、变量的权限不能放大
2、指针的权限不能放大
3、临时对象
int& rb = a3; double d = 12.34; int& rd = d
这样⼀些场景下a3的和结果保存在⼀个临时对象中存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以。
(三)引用和指针的区别
• 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
• 引⽤在定义时必须初始化,指针建议初始化,但是语法上不是必须的。
• 引⽤在初始化时引⽤⼀个对象后,就不能再引⽤其他对象;⽽指针可以在不断地改变指向对象。
• 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
• sizeof中含义不同,引⽤结果为引⽤类型的⼤⼩,但指针始终是地址空间所占字节个数(32位平台下
占4个字节,64位下是8byte)
• 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些
五、inline 关键字
(一)宏的不足
C语言中的宏在使用时候往往会产生一些错误,使用 inline就是为了解决这个问题
首先排除我们写宏时候容易少写括号造成错误看下面这种情况,因为没有正确的写宏#define MUL(a, b) ((a) * (b))
造成错误,从而有了两个答案。
再看这种情况,宏的内容写得没有问题,但是因为宏的机制造成错误
综上,我们有了inline 关键字.
(二)inline 的用法
•⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联函数就不需要建⽴栈帧了,就可以提⾼效率。
• inline对于编译器⽽⾔只是⼀个建议,加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
• inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
六、nullptr 关键字
(一)C语言中的NULL
在C语言中,NULL是一个宏,定义为0
#ifndef NULL #ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif#endif
这个情况会造成一些谬误
(二)nullptr 关键字
C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
结束语
这是小编C++的第一篇文章,如果觉得文章看了有收获,可以多多关注哦