目录
命名空间
关键字namespace,目的是对标识符进行本地化,防止命名冲突
using namespace来展开命名空间域,展开后相当与暴露在全局,也可以指定展开,using N::a
展开空间命名域中的命名不能与全局同时存在
" :: "域作用限定符,能够指定访问命名空间域,例如展开命名空间N中的变量a ,N::a
注:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
C++中的输入和输出
必须要包含std 和 头文件#include <iostream> (不需要.h 结尾)
注:如果用 using namespace std 会使得标准库全部暴露在外,一般写项目时,使用std::cout 或者 using std::cout
std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
cout<< <<endl cin>>
cout标准输出对象,cin标准输入对象
<<流插入运算符,>>流提取运算符
cout跟cin都可以自动识别类型,比printf跟scanf更方便
缺省参数
在函数定义和声明时,给形式参数指定一个值,调用时没有指定实参则使用指定的值
void Func(int a=0)
{
cout<<a<<endl
}
int main()
{
Func(10);//结果为10
Func();//结果为0
return 0;
}
全缺省:参数全部都给缺省值
void Func(int a = 10, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
半缺省
函数传参时从左往右传参,缺省是从右往左缺省
void Func(int a, int b = 20, int c = 30)
{
cout<<"a = "<<a<<endl;
cout<<"b = "<<b<<endl;
cout<<"c = "<<c<<endl;
}
注: 1、如果从左往右缺省就会报错
2、缺省参数不能同时出现在定义跟声明
头文件中的是声明,声明给值,定义不给值
3、缺省值必须是常量或者全局变量
函数重载
定义:是一种特殊的函数,C++中允许使用功能类似的同名函数,这些函数的参数部分不同(参数类型、参数个数或者参数类型顺序)
注:1、函数参数相同,返回类型不同时,不构成重载
2、当同名函数存在一个没有形参时,不构成重载,调用存在歧义
返回值不同,参数不同时,也能通过编译
引用
引用就是给变量取别名,不是定义新的变量,不会单独开空间,共用同一内存空间
类型 &引用变量名=引用实体
特性
1、一个变量可以有多个别名
2、引用定义时必须要初始化
3、只能引用一个实体,不能引用多个实体
变量与引用类型必须相同
常引用
在引用时,权限只能平移不能放大
使用场景
1、作参数
能够避免传地址
2、作返回值
返回值无论是静态变量还是局部变量都会进行拷贝成临时变量,传引用返回能够减少拷贝
类型转换也会产生临时变量
这里会报错的原因是因为临时变量具有常性,int& ret使得权限放大,两种解决方法
1、使用const int& ret
2、对引用作返回值,int& func()就不会产生临时变量
函数返回时,如果出了作用域,返回对象还在,则用传引用返回
如果出了作用域,返回对象不在了,则用传值返回
在底层汇编指令中引用跟存储地址是相似的
内联函数
以inline修饰的函数叫做内联函数,在调用内联函数的地方,函数直接展开,减少函数调用开栈帧
特性
1、内联函数是一种空间换时间的方法
2、内联只是对编译器的一种建议,是否用取决于编译器,适合频繁调用短的函数(长的函数,递归函数都会被否决)
3、内联函数声明跟定义不要分开,因为函数是直接展开,找不到地址
注:debug模式下不会调用内联,不方便调试,release模式下调用内联对程序进行优化
auto关键字
auto定义变量时编译器自动匹配类型且必须初始化
1、auto与指针、引用
auto与auto*相同,引用需要加上&
int i=0;
auto a=&i;
auto* b=&i;
auto& c=i;
2、定义同一行代码
定义同一行代码时会自动匹配第一个变量,如果后面与前面类型不同则会报错
3、不能使用的场景
a.不能做函数参数
b.不能直接声明数组
指针空值nullptr
在C语言中,NULL空指针可能被定义为0,在c++11中引入了nullptr
nullptr是关键字,表示指针空值,不需要包含头文件