C++开篇
·
其实写这篇文章之前,我并不是刚开始学习C++,目前已经学到了STL部分,今天之所以来写这篇文章,多是为了回顾和复习前面所学习的知识点,因为C++刚开始学起来难度会有点大,并且知识点零碎,我不会写的那么仔细,因为只是为了个人的知识点复习,如果有些地方能帮到大家,那我很欣慰。
namespace的定义
- namespace本质是定义出一个域,这个域跟全局域各自独立,不同的域可以定义同名变量。
- C++中域有函数局部域,全局域,命名空间域,类域,域影响的是编译时语法查找一个变量/函数/类型出处,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的生命周期,命名空间域和类域不会影响变量生命周期。
- namespace只能定义在全局,当然他还可以嵌套定义。
- 项目工程中多文件中定义的同名namespace会认为是一个namespace,不会冲突。
- C++标准库都放在一个叫std(standard)的命名空间中。
命名空间的使用
- 指定命名空间访问
- using将命名空间中某个成员展开,项目中经常访问的不存在冲突的成员推荐这种方式
- 展开命名空间中全部成员,项目不推荐,冲突风险很大
namespace N
{
int a;
int b;
}
//指定命名空间访问
print("%d",N::a);
//using将命名空间中某个成员展开
using N::b
print("%d",b);
//展开命名空间中全部成员
using namespace N;
缺省参数
-
C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值
-
带缺省参数的函数调用,规定必须从左到右依次给实参,不能跳跃给实参
-
函数和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值
const引用
- 引用一个const对象,必须用const引用。const引用也可以引用普通对象,因为对象的访问权限在引用过程中可以缩小但不能放大
- 不需要注意的是类似 int& rb = a*3; double d = 12.34; int& rd = d; 这样⼀些场景下a*3的和结果保存在⼀个临时对象中, int& rd = d 也是类似,在类型转换中会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要⽤常引⽤才可以
- 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象。
inline
- ⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样⽤内联函数就需要建⽴栈帧了,就可以提⾼效率
- inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。
- C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调试,C++设计了inline⽬的就是替代C的宏函数。
- inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址,链接时会出现报错。
nullptr
- C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的f(int*)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL);
调⽤会报错。 - C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被隐式地转换为指针类型,⽽不能被转换为整数类型。
更多推荐



所有评论(0)