文章目录
前言
今天我们来了解一下C++入门中最后几个零碎的知识点,我们就能进入类的学习了!加油呀!
一、内联函数
1.含义
以inline 修饰的函数叫为内联函数,编译时C++编译器会在用内联函数的地方展开,没有函数压栈的开销,提高程序运行的效率。
c语言中:
c++中:
2.内联函数的特征
1.inline是一种以空间换时间的做法,省去调用函数额外开销,所以代码很长或者有循环/递归的函数不适宜作为内联函数。
2.inline对于编译器而言只是一种建设,编译器会自动优化,如果定义为inline的函数体内有循环/递归等等,编译器优化时会忽略掉内联。
- inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
3.宏的优缺点
优点
- 增强了代码的复用性
- 提高了性能
缺点 - 不方便调试宏(预编译阶段进行了替换)
- 导致代码可读性差,可维护性差,容易误用
- 没有类型安全的检查
二、auto关键字
1.auto的含义
使用auto修饰的变量,是具有自动存储器的局部变量。
在C++11中,auto不再是一个存储类型指示型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得.
使用auto定义变量时,必须对其进行初始化。
auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”。
2.auto的使用
auto与指针和引用结合起来使用:
用auto声明指针类型时,用auto和auto*没有任何区别,但是auto声明引用类型时则必须为&。
代码如下(示例):
int main()
{
int x=10;
auto a=&x;
auto* b=&x;//第二和第三行的代码意义相同
auto& c=x;//引用
}
auto不能推导的场景
1.auto不能作为函数的参数
代码如下(示例):
void TestAuto(auto a)
{
....
}
编译器无法对a的实际类型进行推导。
2.auto不能直接用来数组
3.为了避免与C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。
3.基于范围的for循环(C++11)
for循环后的括号由冒号“:”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
代码如下(示例):
void TestFor()
{
int array[]={1,2,3,4,5};
for(auto& e:array)
e*=2;
return 0;
//自动遍历,依次取出array中的元素,赋值给e,直到结束
}
三.指针空值nullptr(C++11)
在c++98中,NULL实际是一个宏,在传统的C头文件(stddef.h)中,可以看到如下代码:
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量,这样的设定,就会不可避免的遇到一些麻烦。
代码如下(示例):
void f(int)
{
cout<<"f(int)"<<end1;
}
void f(int*)
{
cout<<"f(int*)"<<end1;
}
int main()
{
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
程序本意是想通过(NULL)调用指针版本(int*)函数,但是由于NULL被定义为0,所以与程序的初衷相悖。
注意:
- 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的。
- 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
- 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。
总结
到这里C++的初步入门已经结束了,下次就是类和对象的学习了,大家加油呀。我也会尽量快点更新的,都看到这里,不关注一下嘛?只要动动你的小手指。