
目录
一.函数重载
1.定义:在C++中,可以在同一作用域内使用同名函数 ,但要求同名函数形参不同,比如参数类型不同,参数个数不同或者参数类型顺序不同。
注意只有函数返回类型不同,参数相同不构成函数重载。
2.使用
(1)参数类型不同
cpp#include<iostream> using namespace std; int Add(int x, int y) { return x + y; } double Add(double x, double y) { return x + y; } float Add(float x, float y) { return x + y; } int main() { cout << Add(1 , 1) << endl; cout << Add(1.1, 2.2) << endl; cout << Add(2.2f, 3.3f) << endl;//C++中小数默认double,若float,则调用时写Add(1.1f,2.2f); return 0; }(2)参数个数不同
cpp#include<iostream> using namespace std; void f() { cout << "f()" << endl; } void f(int a) { cout << "f(int a)" << endl; } int main() { f(); f(1); return 0; }(3)参数类型顺序不同
cpp#include<iostream> using namespace std; void f(int a, char b) { cout << "f(int a , char b)" << endl; } void f(char b, int a) { cout << "f(char b , int a)" << endl; } int main() { f(1, 'a'); f('a', 1); return 0; }注意:下面两个函数本身构成函数重载,但调用时会报错,因为编译器不知道调用哪个函数。
cpp#include<iostream> using namespace std; int f() { cout << "f()" << endl; } int f(int a = 0)//缺省参数 { cout << "f(int a)" << endl; } int main() { f(); }
二.引用
1.定义:
引用相当于给一个变量取了新名字 ,但它不像指针会开辟新的内存空间,而是引用和它引用的变量共同用一块内存空间。
2.形式:
类型& 引用别名 = 引用对象
cpp
int a = 0;
int& b = a;//引用,此时a就是b,b就是a
3.使用注意事项
(1)引用在定义时要初始化
cpp#include<iostream> using namespace std; int main() { //正确: int a = 0; int& b = a; //错误: int& c;//c无初始化 return 0; }
(2)一个变量可以有多个引用(注意一个变量引用多个变量,其中一个变化,其它引用的变量要一起变化)
cpp#include<iostream> using namespace std; int main() { int a = 0; int& b = a; int& c = a; int& d = b;//a b c d是同一个变量 b++;//a c d值与b相同 cout << a << endl; cout << b << endl; cout << c << endl; cout << d << endl; return 0; }
(3)引用一个实体后,不能再引用另一个实体,即C++引用定义后不能改变指向。(若又"引用"另一个变量,则当作另一个变量值赋予该变量)
cpp#include<iostream> using namespace std; int main() { int a = 1; int& b = a; int c = 100; b = c;//这里不是改变b的引用,而是将c的值赋给b(a跟b发生相同的改变) cout << a << endl; cout << b << endl; cout << c << endl; return 0; }
(4)引用主要用于传参和返回值(不用申请额外空间从而提高效率,同时便于简单,便于理解,而不是用复杂指针来传址调用)。以前我们用指针传址调用,才能改变实参值:
cpp#include<iostream> using namespace std; void swap(int* x, int* y)//用指针接收 { int tmp = *x; *x = *y; *y = tmp; } int main() { int a = 1; int b = 2; cout << a << endl; cout << b << endl; swap(&a, &b);//传址调用 cout << a << endl; cout << b << endl; return 0; }现在可以使用引用方式,实参传递不再是变量地址,而是变量本身:
cpp#include<iostream> using namespace std; void swap(int& x, int& y)//引用 { int tmp = x; x = y; y = tmp; } int main() { int a = 1; int b = 2; cout << a << endl; cout << b << endl; swap(a, b);//传变量本身 cout << a << endl; cout << b << endl; return 0; }易错点:函数调用结束后,a销毁,因此不能返回in&类型。
cppint& func() { int a = 0; return a; }(5)const引用:一般用于函数参数中
--引用const对象
cppconst int a = 0; const int& ra = a; //a只读不写 eg. a++是错的 //ra只读不写 eg. ra++是错的--引用普通对象:缩小rb权限,但不缩小b的权限。(即rb只能只读不写,b可读可写)
cppint b = 0; const int& rb = b; //b可读可写 eg. b++是正确的 //rb只读不写 eg. rb++是错误的注意:引用只能缩小权限,不能放大权限。
cppconst int a = 0; int& ra = a;//错误,ra权限扩大但可以建立新变量。(权限无放大,只是开辟新空间)
cppconst int a = 0; int ra = a;--引用常量
cppconst int& ra = 0;//正确 int& ra = 0;//错误--引用临时对象(临时对象:编译器需要一个空间暂存表达式的求值结果时创建的一个未命名对象,比如表达式返回值或类型转换)
cppint a = 1; const int& ra = a*3;//a*3是表达式的值,属于临时变量 double b =1.11; const int& rb = b;//b类型需要转换,属于临时变量
(6)指针与引用关系:二者相辅相成,功能上有重叠部分,但又不能完全替代另一方。
--引用是一个变量的别名,不开空间 ;指针是存储一个变量的地址,开空间。
--引用必须初始化;指针建议初始化(可以不初始化)。
--引用在初始化时引用一个对象后,不能引用其它对象;指针可以不断改变指向的对象。
--sizeof计算引用结果是引用类型大小;sizeof计算指针大小是地址空间所占字节个数(32位平台下是4字节,64位平台下是8字节)。
--引用可以直接访问指向对象;指针需要解引用才能访问指向对象。
--引用更安全;指针容易出现空指针和野指针问题,不安全。
三.inline
1.inline修饰的函数叫做内联函数 ,编译时编译器会在调用的地方展开内敛函数,这样内联函数不需要建立栈帧,达到提高效率目的。
2.可以替代#define宏函数(宏函数易出错)
3.inline适用于频繁短小的函数。(代码多一些的函数,编译器会自动忽略)
4.涉及多文件时,inline修饰的函数定义和声明一起放到头文件中(不能分开)。
四.nullptr
空指针(NULL在C++中被定义字面常量0)

