命名空间
解决命名冲突:using namespace std; (std是C++标准库的命名空间,要使用c++库,就要授权展开std)
命名空间可以定义变量/函数/类型/嵌套定义和访问
#include<iostream>
namespace bit
{
int rand = 10;
int Add(int x, int y)
{
return x + y;
}
namespace xxx
{
int rand = 1;
}
}
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("%d \n", bit::xxx::rand);
printf("%d \n", bit::rand);
printf("%d \n", bit::Add(2,30));
return 0;
}
C++输入输出
缺省参数
- 全缺省
- 半缺省
缺省参数声明和定义不能同时给 ,声明给,定义不给
//缺省参数
void fun(int a = 1)
{
cout << a << endl;
}
//全缺省
void func(int a = 8, int b = 5, int c = 0)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
//半缺省--从右往左,给缺省值
void f(int a , int b = 5, int c = 0)
{
cout << a << endl;
cout << b << endl;
cout << c << endl;
}
int main()
{
fun();
fun(3);
func();
f(1);
f(1, 3, 4);
return 0;
}
函数重载(同名不同义)
同一作用域中功能不同的同名函数,函数名可以相同,参数不能相同(参数个数,类型,参数顺序),与返回值无关
using namespace std;
int fun(int x, int y)
{
return x + y;
}
int fun(double x, double y)
{
return x + y;
}
int main()
{
fun(1, 2);
fun(1.0, 23.3);
return 0;
}
调用存在歧义
using namespace std;
int fun(int x)
{
cout << "fun(int x)" << endl;
}
int fun(int x,int a=1)
{
cout << "fun(int x,int a=1)" << endl;
}
int main()
{
fun(1);
return 0;
}
C++支持函数重载的原理
编译器处理的过程
- 预处理:展开头文件(授权)、删除注释、宏替换、条件编译(解决跨平台。。。)、生成 .i 的文件
- 编译:检查语法,生成汇编代码(指令级代码) 、生成 .s 的文件
- 汇编:将汇编代码生成二进制机器码、 生成 .o 的文件
- 链接:合并链接,生成可执行程序 .out/ .exe 的文件 (不是所有文件都需要链接,如果函数直接定义,就不需要)
c语言编译时直接用函数的名字,未加任何处理,所以不能进行函数重载
c++使用了函数名处理规则,只要函数参数不同,修饰的函数名就不一样,所以支持重载
引用 (取别名)
引用是给已存在的变量取一个别名,他和他引用的地址共用同一块空间
PS:引用类型要和其引用实体类型相同
引用特性
- 必须在定义时初始化
- 一个变量可以有多个引用,一旦引用一个实体,就不能引用其他实体
- 在同一个域中,引用不能同名
引用做返回值
- 提高效率(中间不会生成临时变量)
- 修改/获取返回值
局部变量,不能用引用返回;出了函数作用域,如果变量还存在,就可以用引用做返回
传引用传参(任何时候都可以用)
- 提高效率
- 输出型参数
c
常引用
引用的过程中权限可以平移,可以缩小,不能放大
using namespace std;
int main()
{
const int a = 10;
//放大
//int& b = a;
//平移
const int& b = a;
//缩小
int x = 3;
const int& y = x;
return 0;
}
生成了临时变量, 临时变量具有常性
int fun()
{
int a = 1;
return a;
}
int main()
{
//const int a = 10;
放大
int& b = a;
平移
//const int& b = a;
缩小
//int x = 3;
//const int& y = x;
//int i = 0;
//const double& c = i;
const int& ret = fun();
return 0;
}
关键字:auto
根据表达式自动推导类型