⭐本篇文章为C++学习的第三篇:主要了解内联函数和部分c++11新特性
⭐本人c++代码的Gitee仓库:c++学习 · 橘子真甜/yzc的c++学习 - 码云 - 开源中国 (gitee.com)
一. 内联函数
以inline修饰的函数称为内联函数,编译的时候c++编译器会在内联函数的地方展开,这样就没有函数栈帧的开销,从而提高效率。
1.inline是一种用空间换取时间的做法,在编译阶段,使用函数体替换函数调用
2.一般将函数规模小,无递归,且频繁调用的函数作为内联函数
3.不要将inline函数的声明和定义分离,这样会导致链接错误。由于inline函数被展开,就没有函数地址,链接就找不到。
面试题:宏的优缺点,c++有哪些技术可以替代宏?
优点:
1. 增强代码的复用性
2. 提高性能
缺点:
1. 预编译阶段会宏替换,不方便调试
2. 代码可读性差,可维护性差,容易误用
3. 没有类型安全检查
宏常量:
可以使用const关键字定义常量
宏函数:
可以使用inline关键字定义内联函数替换宏
二. C++11新特性
2.1 自动推导 auto
随着程序变复杂,很多变量的类型也变复杂。如
1. 类型名称长且难写
2. 含义不明确导致出错
//定义一个变量it
std::map<std::string, std::string>:: iterator it;
为了解决这一问题,c++11使用了auto
auto是一个新的类型指示符来指示编译器,auto声明的变量必须在编译器的编译时期推导而得。且使用auto定义变量的时候必须对其进行初始化
举例:
#include<iostream>
using namespace std;int main()
{int a = 10;string s = "hello world";auto b = a;auto& str = s;cout << "a=" << a << " b=" << b << endl;cout << "s=" << s << " str=" << str << endl;return 0;
}
auto使用细则:
1. auto一般与指针和引用结合起来使用,auto定义指针无需加上*, 定义引用必须加&
int main()
{int a = 10;string s = "hello world";auto b = &a;auto& str = s;
}
2. auto可以在同一行定义多个变量,但这些变量必须是同一类型
3.auto定义变量不能作为函数的参数,不能用来声明数组
2.2 基于范围的for循环
c++11有一个新的for循环来遍历数组等变量。
格式为: for循环后面的括号由 : 分为两部分,第一部分是范围for用于迭代遍历的变量,后一部分是迭代遍历的范围
在范围for中,可以使用continue结束此次循环,也能使用break跳出循环
举例:
#include<iostream>
using namespace std;int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 };//正常for循环for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){cout << arr[i] << " ";}cout << endl;//范围for,使用auto自动推导元素e的变量,范围在整个arr中for (auto& e : arr){cout << e << " ";}cout << endl;return 0;
}
运行结果:
范围for使用的条件:
1. for循环的范围是确定的,不确定无法遍历
2. 迭代的对象需要实现运算符重载++和==
2.3 指针空值nullptr
在c++98中。NULL被定义为常量0或者(void*),这样会有一些错误,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器 默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。
1. 在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入 的
2. 在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同。
3. 为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。