C++ 是一门面向对象的语言。
C++98 是C++标准第一个正式版本,现在阶段C++还在不断更新中,是一门值得深入学习的编程语言。
下面是我对C++初学的一些基本了解。
命名空间:namespace
对标识符的名称本地化
一个命名空间就定义了一个新作用域
编译器会合并命名空间相同的命名空间
缺省参数(C语言不支持):声明或定义函数时为函数参数指定默认值
半缺省参数 由右到左依次给出,不能间隔
缺省参数不能在函数定义和函数声明中同时给出
extern"C" :在函数前加 代表这个函数按C语言规则来编译
extern“C" int swap(int &a, int &b);
引用:相当于给已存在的变量取一个别名,它和引用变的量共享一块内存空间
用法:类型& 引用变量名 = 引用实体(引用类型必须和引用实体是同种类型)
特性
引用在定义时必须初始化
一个变量可以有多个引用
引用一旦引用一个实体,再不能引用其他实体
使用的场景:
做参数
做返回值 注:返回引用时返回的是变量的地址。
void Add(int &a, int &b)
int & Add(int &a,int &b)
int &sum = Add(a,b);
与指针的区别
底层用指针实现
- 引用在定义时必须初始化,指针没有要求
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
- 没有NULL引用,但有NULL指针
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4 个字节)
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
- 有多级指针,但是没有多级引用
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
- 引用比指针使用起来相对更安全
**内联函数:**以inline修饰的函数,编译时C++编译器会在建议调用内联函数的地方展开,无压栈的开销,提高程序运行效率
是一种以空间换时间的做法,在递归和迭代时不适用
编译器会自动优化,不一定一定会使用
inline使用时,不要将声明和定义分离,避免链接错误(inline展开后无函数地址)
宏的优缺点:
优点:
1.增强代码的复用性。 2.提高性能。
缺点:
1.不方便调试宏。(预编译阶段进行了替换)
2.导致代码可读性差,可维护性差,容易误用。
3.没有类型安全的检查 4。单纯的替换
内联函数可用来替换宏
inline void Swap(int &a, int &b);
auto关键字:(C++中)auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。(定义时必须初始化)。
auto使用时 与引用类型结合时必须加& 利用指针时不用加 *
auto无法推导的情况:
1.不能作为函数参数 //由编译时期推导
2.不能直接声明数组
3.实例化模板时,不能将auto作为模板参数
int a = 10;
auto b = a; //推导auto为int
auto c = 'm' //推导auto为char
基于范围的for循环:对于一个有范围的集合,for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
对于类而言,应该提供begin和end方法。
int array[] = {1, 2, 3, 4, 5};
for(int a : array);
指针空值 nullptr(C++11)
注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议好使用nullptr