C++第一课
命名空间
- 为了防止在同一个工程或文件中两个相同变量的命名冲突
- 一个命名空间就是一个作用域
命名空间的属性
- 命名空间里面可以放
- 变量
- 函数
- 命名空间(q嵌套)
命名空间的使用
- [空间名]::[空间内容](只是一次使用某个空间的内容)
- using namespace [空间名] (默认使用某个空间)
- using [空间名] :: [空间内容](默认使用此空间的此变量)
简单输入输出
- c++的输入输出标准头文件为 #include
- 输出:cout<<[要输出的对象]<< endl;
- cout代表console out
- 此句话的意思为将要输出的对象送到console out
输入:cin>>[接收的空间];
- cin代表console in
- 此句话代表将console in 送到接收的空间中
- 接收空间就是变量
cin 和 cout 会自动识别类型,不用手动格式化
缺省参数
全缺省参数
函数中所有的而参数都有缺省值,例如
int Add(int a = 10; int b = 20)
{
return a + b;
}
如果调用的时候只是传入了部分参数(相对与此函数的话传入了一个参数,或者没有传参,只是调用),结果如下:
Add(1);//此结果为a为1, b 为20, 返回值为21;
Add(1,2);//此结果为a为1,b为2,返回值为3;
Add();//此结果为a为10,b为20,返回值为30;
半缺省参数
函数中并不是所有的参数都有缺省值,例如:
int Add(int a, int b, int c=2)
{
return a + b + c;
}
半缺省参数的参数后面不能有无缺省的参数
Add(1,2);//此结果为a为1,b为2,c为缺省参数2,返回值为5;
Add(1);//此结果为报错
Add(1,2,3);//此结果为a为1,b为2,c为3,返回值为6
无缺省的参数在调用时必须传参
缺省参数不能只使用中间缺省参数的缺省值。
C/C++函数的调用约定为传参是从右向左传的。
缺省值可以为常量、全局变量或者宏定义的符号。
函数重载
函数名相同,参数不同(数量或者类型或者不同类型参数的位置不同)的函数;
重载函数的返回值可以不同(仅仅返回者不同的函数不能构成重载的)
重载函数的功能可以不同
函数重载的存在条件
作用域相同(全局,命名空间)
参数列表不同
函数名必须相同
例如:
int Add(int a, int b){ return a + b; }
double Add(double a, double b){ return a + b; }
尽量避免与缺省函数的重载
为什么C语言不支持函数重载?
编译器在链接时是通过寻找函数名来调用函数的。
因为c语言在编译的时候编译器(VS)只是给函数名前面加上下划线(不管参数列表相不相同),所以相同函数名加上下划线后还是一样的,所以编译器无法确定调用哪个。
在c++里面,编译的时候,编译器会给参数列表不同函数名相同的函数后面加上区别的标志,参数列表不同标志不同,所以链接的时候就可以区分重载的函数了。
总结:C语言和C++随函数的函数名修饰规则不同,导致C语言不能像C++那样支持函数重载。那么C++就不能使用C语言编译的库了,但是可以使用
extern "C" + 函数声明
来使用C编译的库。
引用
引用的概念
引用就是给一个变量起一个别名,此别名并不会再次开辟空间,而是和它引用的实体公用同一块空间
引用的声明
int a = 10;
int& ra = a;//普通引用
const int b= 20;
const int& rb = b;//常引用
const int& rx = 10;//常引用
引用的属性
- 引用的变量和引用的地址是相同的,引用在声明的时候必须初始化。
- 一个引用只能和一个实体结合,并且不能再次改变
- 具有常属性的实体只能和常引用结合,常引用的不能改变的
- 引用的声明周期小于等于实体的声明周期。
如果声明的引用和实体的类型不一样,那么将会创建一个空间将这个实体按照引用的类型把数据拿出来(有可能截断)放入这个空间,因为此空间创建之后,用户不能知道此空间的名字,或者地址,所以此空间具有常属性,所以此引用应该用常引用的类型。例如:
double a = 12.1;
const int&ra = a;
//a和ra的地址不一样
通过传引用来改变实参
void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a, b)
}
//结果是将a和b的值进行了交换
思考为什么引用可以将两个值进行交换?
- 其实在底层,引用是通过编译器转化为指针的,即处理方式一模一样,所以在底层还是给引用申请了空间。
引用就相当于这样的指针:
int a = 10; int* const ra = &a;
但在代码层面使用引用并不用进行解引用,所以可以认为引用就是上述指针的封装。
- 因为const类型的变量在声明时必须初始化,所以引用在初始化的时候也必须初始化。
引用和指针的不同点
- 引用声明时必须初始化
- 指针可以为NULL,引用不能为NULL
- 引用在引用一个实体之后就不能在引用其他实体,但是指针可以。
- sizeof指针 代表指针的大小, sizeof引用 代表实体的大小。
- 引用自加1代表给实体加1,指针加1代表向后移动一个类型。
- 右多级指针,没有多级引用
- 访问实体方式不同(用户层面),指针需要解引用,引用不用解引用。
- 引用比指针更加安全
C++全局属性
C++中的const关键字
在C语言中#define定义的常量符号在C++中完全可以用const修饰的变量来替换,因为Const修饰的变量在使用的时候,编译器在预处理的时候就已经将const修饰的变量已经进行的替换尽管你用指针去修改此便俩个的值,但是此变量在预处理的时候就已经替换了
C++中的 inline关键字
- inline关键字修饰的函数叫做内联函数,其作用给是告诉编译器,在执行到调用此函数的时候,再将此函数展开。
- inline只是给编译器的一个建议,但是编译器还是先判断此函数是否符合优化的条件
- 如果代码很长或者含有循环,递归,编译器将会忽略inline关键字的修饰。
- inline修饰的函数可以用来替换宏函数,并且没有宏的副作用。