1、内联函数inline
作用:不会调用函数,而是将代码块展开,直接复制过去。不会开辟栈空间,也不会回收栈空间,这样就提高效率。
使用内联函数的情况:
1.函数代码体积不大
2.经常频繁调用
但是也不一定会被编译器展开成为内联函数,比如递归函数,就不会被编译器展开成为内联函数。
inline int sumA(int v1, int v2) {
return v1 + v2;
}
int main(int argc, const char * argv[]) {
cout << sumA(12, 2) << endl;
return 0;
}
2、内联函数与宏的区别
- 两者都可以减少函数调用的开销
- 对比宏,内联函数多了语法检测和函数特性
- 思考一下代码的区别
#define sum(x) (x + x)
inline int sum1(int x) {
return x + x;
}
int main(int argc, const char * argv[]) {
int a = 10;
int b = 10;
cout << sum(++a) << endl;
cout << sum1(++b) << endl;
return 0;
}
- 不同的编译器环境下,输出的结果有所不同,第一个有的是23,有的是24
- 但是这种使用情况下,都不太合理,函数调用方式更加合理
23
22
Program ended with exit code: 0
3、表达式用法
int a = 1;
int b = 2;
// 情况一:
// (a = b) = 4; // 输出结果 a = 4;
// 情况二:
// (a > b ? a : b) = 4; // 输出结果 b = 4;
4、const
- 修饰不可变常量
以下例子:关键点
const只修饰挨着的右边的内容
int age = 10;
int height = 30;
const int *p1 = &age; // *p1 不能改,p1可以改
int const *p2= &age; // 和p1一样,和上面没区别
int * const p3= &age;
*p3 = 20;
// p3 = &height; // 这个会报错
const int * const p4 = &age; // p4 和 p5一样
int const * const p5 = &age;
5、reference 引用
- 定义了一个age的引用,refAge相当于是age的别名
- 一旦使用的时候,就必须要初始化
- 一旦指向某个元素,就不能修改,一夫一妻,从一而终。
- 价值:比指针更安全
- 如下
int age = 10;
// 定义了一个age的引用,refAge相当于是age的别名
int &refAge = age;
refAge = 20; // 使用refAge,就是相当于使用age
- 当作参数使用,交换值
void swap(int *v1, int *v2) { // 不使用引用
int tmp = *v1;
*v1 = *v2;
*v2 = tmp;
}
void swap2(int& v1, int& v2) { // 使用引用
int tmp = v1;
v1 = v2;
v2 = tmp;
}
int main() {
int a = 10;
int b = 20;
// swap(&a, &b);
swap2(a, b);
cout << "a =" << a << ", b =" << b << endl;
getchar();
return 0;
}
- 引用的本质:就是指针,是弱化了的指针