目录
1.内联函数
1.1内联函数的定义
1.2特性
2.auto关键字
2.1auto的简介
2.2注意事项
3.范围for
4.nullptr空指针
1.内联函数
在C语言中,无论使用宏常量还是宏函数都容易出错,而且无法调试。而C++为了弥补这一缺陷,引入了内联函数的概念替代宏函数。
1.1内联函数的定义
以inline修饰的函数被叫做内联函数,编译时C++的编译器会在调用内联函数的地方展开函数定义,没有建立栈帧的开销,内联函数能够提升程序运行的效率。
1.2特性
1.inline是一种以空间换时间的做法,如果编译器将函数当作内联函数处理,在编译阶段,会用函数体替代函数调用。但会让目标文件变大。
2.inline对于编译器而言只是一个建议,不同的编译器对于inline的实现机制可能不同,一般的编译器会将函数规模较小而且不是递归不会频繁调用的函数会采用inline修饰,否则将会忽视inline特性。
3.因为内联函数会在调用时直接展开,如果声明与定义分离内联函数的地址根本不会进入符号表,链接时就无法找到定义的函数,就会发生链接错误。
2.auto关键字
2.1auto的简介
在C++中,随着程序越来越复杂,程序所用的类型也越来越复杂。为了简化代码,增加代码的可读性,C++11引入了自动类型推断auto。在C语言中,auto修饰的变量,是具有自动存储器的局部变量。但是实用性很小,所以C++11中,标准委员会赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
2.2注意事项
1.用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型必须加&
int x = 1;
//auto是指针
auto a = &x;
auto* b = &x;
//auto是引用
auto& c = x;
2.当用auto在同一行声明中定义多个变量时,这些变量必须是相同的类型,否则将会报错。
auto a = 1, b = 2;//正确
auto c = 1, d = 1.11;//error
3.auto不能作为函数的参数或者用来直接声明数组。
3.范围for
for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5 };
//取数组arr的值依次赋值给e
for (auto e : arr)
{
cout << e << endl;
}
return 0;
}
如果我们要改变数组的值的话,我们可以使用引用。
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5 };
//给数组中每个数*2
for (auto&e : arr)
{
e *= 2;
}
return 0;
}
- 基于auto的范围for循环也可以使用continue和break关键字。
4.nullptr空指针
在C语言中,我们定义了一个宏NULL,我们可以在C的头文件(stddef.h)中看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
通过上述代码我们可以知道,NULL既可以是0,又可以是一个空指针。因此我们在使用时就可能会出现一些问题。
我们本想传入NULL来调用传入指针的f函数,但却调用了第一个函数,因此在这个地方出现了歧义。 这是因为在C++98标准中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将0看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。因此,在C++11中,加入了一个新关键字nullptr表示空。
以下是使用nullptr的两个注意点
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入
的
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。