目录
一.命名空间 : (解决命名冲突)
1.在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
2. 定义的三种方式 :
普通
namespace a1
{
int a;
//可以定义变量,也可以定义函数
int add(int x,int y)
{
return x + y;
}
}
嵌套
namespace a1
{
int a;
namespace a2
{
int b;
}
}
分段
//分段定义时,每一段里面的变量和函数都要不同,否则会出现重定义
namespace a1
{
int a;
}
namespace a1
{
int b;
}
3.访问成员 : (三种方式)
a. 命名空间 + 作用于限定符 :: 成员
a1::a;
b. using + 命名空间 + 作用于限定符 :: 成员 (using a1::a)
using a1::a;
c. using + namespace + 命名空间(不建议使用, 可能会造成命名污染)
using namespace a1; //不建议使用,容易造成命名空间污染
二.输入输出(标准输入输出流)
1.不用增加数据格式控制
2.相对C语言的scanf比较安全,不用传址
3.可以连续输入输出
int a , b;
char c;
cin >> a >> b;
三.函数重载 (和返回值类型无关)
c++支持函数重载,函数名重载规则 : 底层通过算法把函数名与参数结合,构造了一个底层全局唯一的函数名.
c++ : 函数名 + 类型首字母
参数个数不同
参数类型不同
参数顺序不同
四.extern "C"
一般用于混合编程
五.缺省参数
声明或者定义函数时,给参数指定一个默认值,在调用时,如果没有指定实参则使用指定值,如果指定则使用指定 实参
1. 全缺省 : 所有的形参为默认值
2.半缺省 : 部分为默认值,从左向右依次赋值
3.声明或者定义,二者选其一
六.引用
int a = 10;
int &ra = a;
1.引用不用开辟空间
2.引用底层还是用指针实现的
3.引用和指针的不同点:
(1). 引用在定义时必须初始化,指针没有要求
(2). 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体
(3). 没有NULL引用,但有NULL指针
(4). 在sizeof中含义不同:引用结果为引用类型的大小但指针始终是地址空间所占字节个数(32位平台下占4个字节)
(5). 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
(6). 有多级指针,但是没有多级引用
(7). 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
(8). 引用比指针使用起来相对更安全
七. 内联函数
inline int add(int a,int b)
1. inline是一种以空间换时间的做法省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
2. inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
八.auto关键字
1.使用auto定义变量时必须对其进行初始化
auto a = 10;
auto a; //错误
2.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&
int x = 10;
auto a = &x;
auto* b = &x;
auto& c = x;
cout << typeid(a).name() << endl;
cout << typeid(b).name() << endl;
cout << typeid(c).name() << endl;
3.引用必须显示 & 符号
4.在同一行定义多个变量
auto a = 1, b = 2;
auto c = 3, d = 4.0; // 该行代码会编译失败,因为c和d的初始化表达式类型不同
九.基于范围的for循环
1.普通
void TestFor()
{
int array[] = { 1, 2, 3, 4, 5 };
for(int e : array)
cout << e << " ";
}
2.迭代器
vector<int> v;
for(const auto& e : v)
{
cout << e << endl;
}
十.指针空值
int *nptr = nullptr;//系统会隐式转换成int*
cout << typeid(nullptr).name() << endl;
1.nullptr : 不用包含头文件,c++将它当做新的关键字引入
2.在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3.尽量用nullptr