一.缺省参数
C++语法同意缺省参数的使用,即定义或声明时给一个缺省值(注:缺省值不能在定义和声明中同时出现),如果没有传值则调用缺省值。(使用时一般在声明时给缺省值)(c语言也支持)
int Add(int x = 0, int y = 0) {//函数参数可以给缺省值
return x + y;
}
struct A{
int x = 5;//结构体变量可以给缺省值
int y = 6;
};
int main() {
A example;
cout << Add(example.x, example.y) << endl;//调用结构体缺省值返回11
cout << Add() << endl;//调用确实值返回0
return 0;
}
在函数这类结构中,我们可能会有多个参数,因此我们可以选择性的给函数中的参数给缺省值,因此缺省参数可以分为全缺省参数和半缺省参数。
①全缺省
int Example(int x = 0, int y = 0, int z = 0) {
return x + y + z;
}
//被注释掉的表示会报错
int main() {
int x = 1, y = 2, z = 3;
cout << Example(x, y, z) << endl;
cout << Example(x, y) << endl;
cout << Example(x) << endl;
cout << Example() << endl;
//cout << Example(x, ,z) << endl;//函数不允许传空
//cout << Example( ,y,z) << endl;//这三个都是错误的写法
//cout << Example(x,y, ) << endl;
cout << Example(y, z) << endl;//缺省参数和传参的名字没有关系
return 0;
}
注意:函数的参数不能传空,也就是选择传参时只能从前往后连续的传参。效果如下:
②半缺省
int Example(int x = 0, int y, int z = 0) {
return x + y + z;
}
//被注释掉的表示会报错
int main() {
int x = 1, y = 2, z = 3;
cout << Example(x, y, z) << endl;
cout << Example(x, y) << endl;
//cout << Example(x) << endl;//传参不能自己找到没有缺省值的参数
//cout << Example() << endl;//由于y没有缺省值,因此必须传参给y
//cout << Example(x, ,z) << endl;
//cout << Example( ,y,z) << endl;
//cout << Example(x,y, ) << endl;
cout << Example(y, z) << endl;
return 0;
}
注意:函数的参数仍然不能传空,并且如果没给缺省值必须传参。
二.引用
在c语言的学习中,我们经常需要传址调用,此时就需要我们通过指针把参数的地址传过去,由于使用指针进行传址调用。但是使用指针进行传址调用时每次都要解引用,十分繁琐,这时候使用引用(&)就会方便很多。如下:(当然指针和引用并不相同,两者都有对方做不到的事情)
int main(){
int a = 5;
int &b = a;//b是a的别名
cout << b << endl;//输出为5
return 0;
}
引用和指针不同,这里b可以看做a的别名,使用b就代表使用a。
void Example(int& x) {//此时x就称做b的别名(地址相同)
x = 1;
}
int* &Example1(int b){//此处返回的是test的地址
int* test = (int*)malloc(sizeof(int));//语法上引用和指针不同,不能用引用接收空间
test[0] = 1;
return test;
}
int main() {
int b = 0;
Example(b);
cout << b << endl;
int* arr = Example1(b);//此时arr是test的别名
cout << arr[0] << endl;
return 0;
}
使用引用来传址调用时,只需要用别名接收变量即可,函数内也不需要解引用,同时传参还不需要取地址,同样引用也可以对返回值来使用。
三.函数重载
在C语言的学习中我们知道函数名不能相同,否则就会重载错误,如果一类函数结构和功能相似,但是它们名字不能相同,这样既不方便阅读,使用起来还麻烦。C++中对其进行了优化,允许函数重载,即参数个数 or 类型 or 类型顺序不同时,允许函数名相同。使用方式如下:
void Swap(int &a,int &b) {
int tmp = a;
a = b;
b = tmp;
}
void Swap(double &a, double &b) {
double tmp = a;
a = b;
b = tmp;
}
void Swap(char &a, char &b) {
char tmp = a;
a = b;
b = tmp;
}
int main() {
int a = 1;
int b = 2;
Swap(a, b);
cout << a << ' ' << b << endl;
char c = 'a';
char d = 'b';
Swap(c, d);
cout << c << ' ' << d << endl;
double e = 2.5;
double f = 1.1;
Swap(e, f);
cout << e << ' ' << f << endl;
return 0;
}
四.nullptr指针
在c语言的中我们置空指针用的是NULL,它类似于NULL宏定义为(int类型)0。
//NULL指针 -> #define NULL 0
void Example()
{
int* p1 = NULL;
int* p2 = 0;
// ……
}
因此在使用空值的指针时,都不可避免的会遇到一些麻烦,如下所示:
void f(int)
{
cout<<"f(int)"<<endl;
}
void f(int*)
{
cout<<"f(int*)"<<endl;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
void Example()
{
int* p1 = nullptr;
// ……
}