目录
前言
本文介绍了在c++中关于内联函数、关键字auto、指针空值的用法,希望能够帮助到大家~
一.内联
1.1概念
以inline修饰的函数叫内联函数,编译时会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
1.2特性
内联函数说白了就是对c语言中宏函数的一种升级。
举例:
#define ADD(x,y) ((x)+(y))
int main()
{
int ret = ADD(1, 2);
return 0;
}
宏的缺点:
- 无法调试;
- 函数参数类型无法安全检查;
- 代码可读性差,语法过于复杂;
注意:inline对于编译器来说只是一个建议,当函数内部定义的行数不多时自然会被采纳提高性能,反之如果行数过多就算用inline修饰编译器也只会把其当作普通函数处理,因为展开太多会影响性能。
注意:inline不建议声明与定义分离,分离会导致链接错误。因为在被inline修饰过的函数在预处理时都会直接展开,后面编译链接是找不到它的地址。
二.auto关键字
2.1auto使用细则
1.自动推导变量类型
举例:
注意:使用auto定义变量时必须对其初始化。
2.简化代码风格
举例:
2.2auto无法使用的场景
1.auto无法作为函数形参
举例:
int fun(auto a, auto b)
{
return a + b;
}
int main()
{
int ret = fun(1, 2);
return 0;
}
由于必须对其初始化的规则,要是传的是空参数那就自相矛盾了 。
2.无法声明数组
int main()
{
int a[] = { 1,2,3 };
auto a[] = { 1,2,3 };
return 0;
}
这个只能说是规定吧,可以自动推导变量但无法推导数组类型。
2.3基于范围的for循环
前面都是小菜平时一般用不到,而这个用法能提高我们的代码简洁度~
正常遍历数组举例:
int main()
{
int arry[] = { 1,2,3 };
for (int i = 0; i < 3; i++)
{
cout << arry[i] << endl;
}
return 0;
}
auto e :arry遍历数组举例;
int main()
{
int arry[] = { 1,2,3 };
for (auto e : arry)
{
cout << e << endl;
}
return 0;
}
该用法能将每一次遍历的结果都存储到e中,若想要连带着改变原本数组中的数值还可以用引用进行搭配。
举例:
int main()
{
int arry[] = { 1,2,3 };
for (auto &e : arry)
{
e++;
cout << e << endl;
//2 3 4
}
for (int i = 0; i < 3; i++)
{
cout << arry[i] << endl;
//2 3 4
}
return 0;
}
使用条件:对于数组而言,就是数组的第一个元素和最后一个元素的范围,对于类而言,应该提供begin和end的方法。
注意:在以下情况中无法使用
举例:
void fun(int arry[])
{
for (auto e : arry)
{
cout << e << endl;
}
}
int main()
{
int arry[] = { 1,2,3 };
fun(arry);
return 0;
}
因为我们在进行auto e:的时候是针对一个实体化的数组,我们需要的是里面的数值,而在上述例子中数组当作为形参的时候只是一段地址,auto e:是无法从一段地址中找到数组里面的数值的。
三.指针空值nullptr
举例:
void fun(int)
{
cout << "fun(int)" << endl;
}
void fun(int*)
{
cout << "fun(int*)" << endl;
}
int main()
{
int* a = NULL;
fun(0); //"fun(int)"
fun(NULL); //"fun(int)"
return 0;
}
本来我们的初衷是0去调用f(int)函数,null去调用f(int*)函数,可结果后者也跟着0去调用f(int)函数了。这是因为早在c语言时的一个小缺陷,define null 0;编译器会把null识别为0去处理,导致当我们真正想使用一个空指针的时候往往它的类型并不是指针类型的。所以在c++中为了使得能够令空指针有一个指针的类型,创造出了nullptr。
举例:
void fun(int)
{
cout << "fun(int)" << endl;
}
void fun(int*)
{
cout << "fun(int*)" << endl;
}
int main()
{
int* a = NULL;
fun(0); //"fun(int)"
fun(nullptr); //"fun(int*)"
return 0;
}