1.内联函数
常规函数在调用的时候,会使程序跳到另一个地址(常规函数的地址),并在函数结束的时候返回。如果在程序内部对常规函数进行多次调用,则会造成较大的开销。宏函数没有栈帧的开销,在预编译期的时候,宏函数就被替换为相应的代码。虽然能够进行代码的替换,但是并不会进行类型的检查,也不可以进行调试。为了解决以上问题,C++提供了内联函数。
需要注意的是内联函数是对编译器进行的建议,编译器会根据具体的情况,决定其是否内联。例如部分编译器发现该内联函数过大或者内联函数调用了自身,则不将其视为内联函数。内联函数需要在声明或者定义函数的时候在头部加上inline。
内联函数会进行类型检查并且在调用点展开,在debug版本中,会产生local符号,可以进行调试,也会进行栈帧开辟的操作,而在release版本中不产生符号,不进行栈帧开辟,不能调试。
内联函数和普通函数一样,是按照值来进行参数的传递的,这也是内联函数比宏函数更为优秀的地方。
#include <iostream>
using namespace std;
#define PRODUCT(X)(X*X)
inline int Product(int x)
{
return x*x;
}
int main()
{
int value1 = PRODUCT(3+4);
cout<< value1 <<endl;
int value2 = Product(3+4);
cout<<value2<<endl;
return 0;
}

根据结果可以看到,使用宏函数所输出的结果是19,和我们所想象的49的结果有较大的出入,这里我们就要想到宏函数仅仅进行内容的替换,替换的结果为value1 = 3+4*3+4;根据这个来计算,所得到的值就是19。如果想要得到49这个值,形式应该为value1 = PRODUCT((3+4));
2.引用变量
引用变量就相当于是某个变量的别名,在声明引用的时候必须对其进行初始化。在声明了引用之后,该引用就和变量绑定,无法成为其他变量的引用。
#include <iostream>
using namespace std;
int main()
{
int value1=10;
int &value2 = value1;
++value2;
cout<<value1<<endl;
cout<<value2<<endl;
++value1;
cout<<value1<<endl;
cout<<value2<<endl;
return 0;
}

从这个结果可以看到,value1和value2进行自增的时候,都会对变量的值造成影响。
引用可以使用在参数从实参传递给形参的过程中。如果没有使用引用,实参会先构造临时变量,再将临时变量的值传递给形参。在使用了引用之后,会直接将实参传递给函数。在函数中,对传递过去的引用的变量值进行修改,会直接影响实参的值,为了保证程序的安全性,如果没有特殊的需求,应尽量使用const与引用搭配,防止函数在运行过程中对实参的值进行修改。同理,如果参数是一个对象的话,使用引用可以直接将对象传递给函数,省去了拷贝构造的操作,在这里也应使用const防止值被修改。
3.默认参数
在函数调用的时候,如果省略了实参,则函数会自动使用的一个值。对于带参数列表的函数,必须从右向左依次添加默认值。例如int Sum(int a,int b=10,int c = 20);这种形式是合法的,从右往左依次给定默认值,没有出现两个被给定默认值的变量之间,某些变量没有被给定默认值的情况。需要注意的是函数参数的默认值不能对其进行重复赋值。
实参会按照从左往右的顺序将值依次赋值给形参,不能够跳过任何参数。
#include <iostream>
using namespace std;
int Sum(int a,int b = 10,int c = 20 )
{
return a+b+c;
}
int main()
{
cout<<Sum(5)<<endl;
return 0;
}

实参传递的时候,按照从左往右的顺序给值,因此5这个值就赋值给了变量a,由于没有给定变量b和变量c的值,这时候就会使用默认值10和20,因此输出的结果是35.
4.重载函数
C++允许同一个作用域中,声明几个功能类似的同名函数,这些同名函数的形式参数(参数的类型、顺序、个数)必须不同。在C语言中函数符号依赖于函数名,因此C语言不支持函数重载。而C++中的函数符号依赖于函数名和函数参数生成,由于函数参数的不同会使得生成的符号有所差异,因此C++可以进行函数重载。需要注意的是不能通过返回值类型不同区分函数是否进行了重载。
在进行函数重载的时候需要遵循部分规则:
(1)不能改变运算符的优先级;
(2)不能改变运算符的结合型;
(3)默认参数不能和重载的运算符一起使用;
(4)不能改变运算符的操作数的个数;
(5)不能创建新的运算符,只有已有运算符可以被重载;
(6)运算符作用于C++内部提供的数据类型时,原来含义保持不变。
#include <iostream>
using namespace std;
int Add(int a,int b)
{
return a+b;
}
double Add(int a,double b)
{
return a+b;
}
int Add(int a,int b,int c)
{
return a+b+c;
}
int main()
{
int a = 1;
int b = 2;
int c = 3;
double value = 4.4;
cout<<Add(a,b)<<endl;
cout<<Add(a,value)<<endl;
cout<<Add(a,b,c)<<endl;
return 0;
}
6059

被折叠的 条评论
为什么被折叠?



