一,命名空间的定义和使用
namespace的本质上是定义出一个域,这个域和全局域相互独立。不同的域中可以定义相同的变量名,函数名,类型。
namespace 的结构是:namespace 名称{}
其中namespace命名空间可以进行嵌套多层
展示:

补充内容:
项目工程中可以定义多个同名的namespace不会造成冲突,会认为是一个命名空间
C++标准库都放在一个名为std的命名空间中
C++中的域有全局域,命名空间域,函数域,类域,域会影响编译时语法查找一个变量/函数/类型出处的逻辑,局部域和全局域还会影响变量的生命周期,命名空间域和类域不会影响变量的生命周期。
二,C++的输入和输出
<iostream>是标准的输入输出流库,定义了标准输入输出对象。
std::cin是istream类的对象,它主要面向对窄字符的标准输入流。
std:out是ostream类的对象,它主要面向对窄字符的标准输出流。
std:endl是一个函数,在流插入输出的时候,相当于一个换行符加刷新缓冲区。
<<是流插入操作符,>>是流提取操作符。
C++的输入和输出可以自动识别变量的类型,C++也能更好的支持自定义类型对象的输入和输出。
using namespace std 就相当于把命名空间创建出的高墙给拆了,可以直接使用命名空间中的对象。
代码展示:
cpp
#include<iostream> //标准输入输出库
//展开标准输入流std空间,方便使用cout函数,cin函数和endl函数
using namespace std;
namespace space
{
namespace k1 //命名空间的嵌套
{
int p = 33;
}
namespace k2
{
int n = 66;
}
double r1 = 5.2;
const char* ch = "add";
char arr[] = "wwSS";
}
using namespace space; //展开命名空间的全部
using namespace k1; //展开命名空间的嵌套命名空间
namespace area
{
int a = 1;//不进行展开,指定命名空间进行访问
int d = 2;
}
using area::d; //展开命名空间的部分成员
int main()
{
cout << p << endl; //33
cout << k2::n << endl;//66
cout << r1 << endl;//5.2
cout << ch << endl;//add
cout << arr << endl;//wwSS
cout << area::a << endl;//1
cout << d << endl; //2
cout << d << "\n";//2
int d1 = 2;
double d2 = 2.3;
char d3 = 'c';
cin >> d1;
cin >> d2;
cin >> d3;
cout << d1 << endl;
cout << d2 << " " << d3 << endl;
return 0;
}
运行结果:
三,缺省参数
1,缺省参数是在声明或定义函数时为函数的参数指定一个缺省值。在调用函数时如果不使用传入实参,就使用缺省参数代替实参,否则就使用实参,缺省参数分为全缺省和半缺省参数。
2,全缺省就是函数的所有参数都有缺省值,半缺省就是函数的一些参数有缺省值,一些没有缺省值,规定对于半缺省一定要从右到左有缺省值,中间不能有跳过给实参。
3,调用带缺省参数的函数时,必须从左到右给实参,不能跳跃给实参。
4,缺省参数不能在函数的声明和定义中同时出现,规定函数声明给缺省值。
展示:

四,函数重载
C++中支持在同一作用域当中出现同名函数,但是要求这些同名函数的形参不同,要么参数类型不同,要么参数的数量不同,要么参数的类型的顺序不同。
展示:
cpp
//1,参数的类型不同
void Func1(int x)
{
cout << "Func1()" << endl;
}
void Func1(double a)
{
cout << "Func1()" << endl;
}
//2,参数的个数
void Func2()
{
cout << "Func2()" << endl;
}
void Func2(int y)
{
cout << "Func2()" << endl;
}
//3,函数参数的顺序不同
void Func3(double x,int y)
{
cout << "Func3()" << endl;
}
void Func3(int y, double x)
{
cout << "Func3()" << endl;
}
int main()
{
Func1(1);
Func1(3.2);
Func2();
Func2(1);
Func3(3.3, 12);
Func3(1,3.2);
return 0;
}
运行结果:

五,引用
1,引用的概念和定义
结构:类型& 引用别名 = 引用对象;

a b c d都是同一个

2,引用的特性
1,在进行引用前引用对象必须初始化
2,一个变量可以有多个引用
3,引用一旦引用一个实体,就不能再引用其他的实体
3,引用的使用
引用在实践中通常是用作函数引用传参和引用做返回值,减少拷贝(C语言传值和传址调用都会创建新的空间)提高效率,改变引用对象和被引用对象。
引用和指针的功能相辅相成,虽然有些重叠,但是互不可以替代,C++的引用不能改变指向,而指针可以。
展示:

4,const引用
const引用是指向常量对象的引用,引用后就不能再对被引用对象的值进行修改。相当于缩小了权限,只能用不能改。
使用引用时要注意权限的问题,权限只能缩小,不能进行放大。
例如:

常数和临时对象不能进行直接引用,需要const修饰,改变权限。

临时对象:编译器需要创建一个空间来存储表达式的求值结果时,所创建一个未命名的对象,这个未命名的对象就是临时对象。
5,指针和引用的关系
1,引用是一个变量取别名,不开辟额外的空间。指针存储的是一个变量的地址,需要开辟空间。
2,引用在使用时必须初始化,指针不一定需要初始化。
3,引用在初始化后就不能再引用其他的对象,而指针可以不断的更改指向的对象。
4,引用可以直接访问对象,而指针需要进行解引用才是访问的对象。
5,sizeof中含义不同,引用的是引用对象的类型的大小,指针则是地址空间所占的字节数(32位下为4个字节,64下为8个字节)。
指针很容易出现空指针和野指针的问题,而引用就很少出现, 相对安全。
六,inline
1,用inline修饰的函数叫做内联函数。调用内联函数可以让函数展开,不创建函数栈帧,就可以提高效率。
2,C语言在程序预处理阶段会替换展开,但是宏函数的实现很复杂,并且不能进行调试,所以C++就设计出内联函数来替代宏函数。
3,inline对编译器来说只是一个建议,编译器会根据情况选择展开或者不进行展开,inline适合调用短小的函数,当函数内容比较大的时候,就会被编译器忽略。
4,inline不建议声明和定义放到两个文件当中,分离会导致链接错误。
5,inline内联函数在debug版本下,是默认不进行展开的,为了方便进行调试。
使用只需要在函数返回值类型前面加上inline

七,nullptr
在C语言中(void*)可以自动转化为其他类型的指针,而在C++中就不可以。
C++中的NULL会被定义为0,在C中则会被定义为无类型的指针(void*),为了表示C++中的空指针,引入了nullptr,nullptr是一种特殊的关键字,可以自动转化为其他的指针类型,但是不能转化为整数类型。
