一、缺省参数
C++中可以为函数参数设置缺省值,这意味着在函数调用中未提供该参数时,将使用默认值。这样可以使函数调用更加简洁。
缺省参数可以大致分为:全缺省参数和半缺省参数
下面是一个例子:
#include <iostream>
using namespace std;
//全缺省参数
int sum(int a = 10, int b = 20) {
int result;
result = a + b;
return (result);
}
//半缺省参数
int add(int a , int b=10) {
int result;
result = a + b;
return (result);
}
int main() {
int a = 100;
int b = 200;
int result;
// 全缺省参数 使用参数a和b调用函数
result = sum(a, b);
cout << "Total value is :" << result << endl;
// 使用参数a调用函数
result = sum(a); //传递一个参数
cout << "Total value is :" << result << endl;
result = sum(); //不传参
cout << "Total value is :" << result << endl;
//半缺省参数
result = add(10,20);
cout << "Total value is :" << result << endl;
result = add(10);
cout << "Total value is :" << result << endl;
// result = add(); 这个是不行的
cout << "Total value is :" << result << endl;
return 0;
}
上面的代码输出结果为:
我们可以看到,全缺省参数,在第二次调用函数时,只提供了一个参数a,但是由于b有默认值,所以程序仍然可以正常运行。第三次调用函数时,没有提供任何参数,a和b都有默认值,程序仍然能够运行。半缺省参数,传两个参数、一个参数都没有问题,不传参数是不行的,因为原来就只设置了一个靠右的缺省参数。
注意:半缺省参数顺序是从右往左,不可以进行间隔,如 int add(int a=10,int b) 这种情况会编译不过。
二、引用
引用提供了一个变量的别名,可以通过该引用来访问变量。使用引用可以使程序更加简洁。我们在语法上认为引用是不开辟空间,实际汇编底层还是用指针call来实现引用。 别名的改变就是本来变量的改变。
下面是一个例子:
#include <iostream>
using namespace std;
int main () {
int i;
double d;
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of reference variable r : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of reference variable s : " << s << endl;
return 0;
}
上面的代码输出结果为:
Value of i : 5
Value of reference variable r : 5
Value of d : 11.7
Value of reference variable s : 11.7
在上面的代码中,我们定义了两个变量i和d,并定义了两个引用r和s,分别引用了i和d。在输出时,我们可以看到,引用r和s所引用的变量与i和d的值相同。
三、内联函数
内联函数是一种特殊的函数,它可以在调用处直接进行代码展开,没有建立函数栈帧,从而避免了函数调用的开销。关键字:inline,适合代码量小,而且本频繁调用的函数。
什么时候编译器不会会进行展开进行内联?
1.debug模式下,编译器默认是不会进行内联展开。
2.代码量大,运行流程复杂。(为了避免造成代码堆积)
注意点:
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址 了,链接就会找不到。
下面是一个例子:
#include <iostream>
using namespace std;
inline int max(int x, int y) {
return (x > y)? x : y;
}
int main () {
cout << "Max value is : " << max(4,7) << endl;
return 0;
}
上面的代码输出结果为:
Max value is : 7
在上面的代码中,我们定义了一个内联函数max,该函数比较两个参数的大小,并返回较大的值。在主函数中,我们调用了这个函数,并直接输出了函数的返回值。
四、指针空值(nullptr)
C++11引入了一个新的关键字nullptr,用来表示空指针。在之前的版本中,通常使用NULL或0来表示空指针,但是它们有些缺陷,例如NULL有时候被定义为0,而0又可以隐式转换为其他类型,造成一些潜在的问题。
下面是一个例子:
#include <iostream>
using namespace std;
int main () {
int *ptr = nullptr;
cout << "The value of ptr is " << ptr << endl;
if(ptr) {
cout << "ptr is not null" << endl;
} else {
cout << "ptr is null" << endl;
}
return 0;
}
上面的代码输出结果为:
The value of ptr is 0
ptr is null
在上面的代码中,我们定义了一个空指针ptr,并输出了它的值。由于nullptr代表空指针,所以ptr的值为0。然后我们对这个指针进行了判断,发现它是空指针,所以输出结果为ptr is null。
五、测试完整代码
缺省参数代码:
#include <iostream>
using namespace std;
//全缺省参数
int sum(int a = 10, int b = 20) {
int result;
result = a + b;
return (result);
}
//半缺省参数
int add(int a , int b=10) {
int result;
result = a + b;
return (result);
}
int main() {
int a = 100;
int b = 200;
int result;
// 全缺省参数 使用参数a和b调用函数
result = sum(a, b);
cout << "Total value is :" << result << endl;
// 使用参数a调用函数
result = sum(a); //传递一个参数
cout << "Total value is :" << result << endl;
result = sum(); //不传参
cout << "Total value is :" << result << endl;
//半缺省参数
result = add(10,20);
cout << "Total value is :" << result << endl;
result = add(10);
cout << "Total value is :" << result << endl;
// result = add(); 这个是不行的
cout << "Total value is :" << result << endl;
return 0;
}
引用代码:
#include <iostream>
using namespace std;
int main () {
int i;
double d;
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of reference variable r : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of reference variable s : " << s << endl;
return 0;
}
内联函数代码:
#include <iostream>
using namespace std;
inline int max(int x, int y) {
return (x > y)? x : y;
}
int main () {
cout << "Max value is : " << max(4,7) << endl;
return 0;
}
指针空值代码:
#include <iostream>
using namespace std;
int main () {
int *ptr = nullptr;
cout << "The value of ptr is " << ptr << endl;
if(ptr) {
cout << "ptr is not null" << endl;
} else {
cout << "ptr is null" << endl;
}
return 0;
}