04/21/2020
C++内联函数
内联函数:编译器将使用相应的函数代码替换函数调用,程序无需跳转到另一个位置处执行代码,再调回来。因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多的内存。1
- 函数声明或者定义前加上inline关键字
inline void test()
{
cout << "inline function";
}
int main(){
test();
test();
return 0;
}
//replace inline
int main()
{
{
cout << "inline function";
}
{
cout << "inline function";
}
return 0;
}
-
内联和宏定义区别
- 内联按值传递,宏不是
- 宏是通过文本替换来实现的
#define SQUARE(X) X*X
#define SQUARE2(X) ((X)*(X))
cout << SQUARE(4+3); //19; is replaced 4+3*4+3
引用
左值和右值
- 左值参数是可被引用的数据对象,例如,变量、数组元素、结构成员、引用和解除引用的指针。
- 右值引用:常量和表达式
- 简单了解“=“号左边叫左值,右边叫右值。
返回引用的或者指针的函数注意的问题
- 函数返回一个指向临时变量的引用,函数运行完毕后它将不在存在,与返回指针一样性质。
为何使用引用参数
- 提高程序运行速度
- 在函数中改变实参
什么时候用值传递,引用或者指针传递
-
数据对象小,用值传递
-
数据对象是数组,用指针,这是唯一的选择
-
数据对象是较大的结构,使用const指针或者const引用
-
数据对象是类对象,则使用const引用,C++新特性加入引用的原因
函数重载
函数名字相同下: -
参数列表数量不同或者参数类型不一致
-
返回类型不一致不属于函数重载
函数重载的作用
- 函数重载减轻命名的痛苦,但是也有可能写出混淆概念的函数。
作用域[^2]
- 作用域通常以一组花括号(“{}”)为标志。一个块就是一个作用域
- if,while等控制流作用域,有函数体作用域,类声明作用域,命名作用域等等
- 块中引入的名字只能在块内部以及嵌套在块中的子块访问
- 在局部块作用域中,声明函数是不好的。最好在全局中声明。
- 嵌套作用域规则:如果内部作用域和外部作用域都有声明话,在内部,先找内部的,外部被隐藏,如果内部没有,再去找外部的。
- C++语言中,名字查找发生在类型检查之前,如果我在内部作用域找到了某个函数声明,外部的将会被隐藏,然后针对这个函数检查形参的的类型。
void print(string);
void func()
{
void print(int);
print("Hello world"); //报错,先找到最近print,外部的print被隐藏了,所以形参不兼容。
}
C++ primer plus 第六版 ↩︎