c++基础知识(inline、auto、nullptr)

⭐️ 内联函数

💬 为什么会有内联函数?

内联函数其实是为了弥补 c 的缺陷,比如当我们遇到了一些少量逻辑和代码的情况时,而这些少量的代码又需要被重复使用多次(swap),我们往往会封装成为一个函数来减少代码的冗余。但是函数在创建和返回的时候存在一些额外的开销,而代码很少执行的速度很快,又由于函数的机制的会导致有一些效率上的问题。所以在 c 中我们一般使用带参宏来解决此场景。

但是宏又是一把双刃剑。宏的缺点: ++1.代码长度上宏替换完可能使程序过于的冗余,编译的时候会有一定的开销。++ ++2.会有操作符优先级的问题。++ ++3.宏也没有类型的检查。++ ++4.也不方便调试。++ ++5.还存在一些带有副作用的参数。++ 宏的优点也很明显 ,++就是执行速度很快,没有函数创建和返回的开销。++

所以在 c++ 中,引入了 inline 修饰的内联函数来替代宏的方式,编译时 c++ 编译器会在条用内联函数的地方展开,没有函数调用时所创建栈帧的开销,内联函数提升了程序运行的效率。

cpp 复制代码
#include <iostream>
using namespace std;

inline void add(int a, int b) {
	int c = a + b;
	cout << c << endl;
}

int main() {

	add(10 , 20);
	
	return 0;
}

ps:

  • inline 是一种以空间换时间的做法,如果编译器将函数当前内联函数处理,在编译阶段,会用函数体替换函数调用(简而言之就是展开函数内部的代码)。
  • inline 对于编译器只是一个建议,当函数规模较小时,没有递归且频繁的调用采用 inline 修饰,否则编译器会忽略 inline 特性。
  • inline 函数不建议声明和定义分离,分离会导致链接错误。因为 inline 被展开后,就没函数地址了,当链接的时候就会找不到。
    • 解决方式直接定义即可。

⭐️ auto 关键字

在早期的 c/c++auto 的含义是:auto 修饰的变量是具有自动存储器的局部变量其实本质上就说说明是局部变量。在 c++11 中,auto 定义的变量会推导其类型,编译器在编译期会将 auto 替换为变量实际的类型。

🌠 例1:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {

	int n = 10;
	auto b = n;
	auto d = 10.2;
	auto c = 'c';

	cout << typeid(b).name() << endl;
	cout << typeid(d).name() << endl;
	cout << typeid(c).name() << endl;

	return 0;
}


ps: typeid(变量).name() 可以打印出变量的类型

auto 还有一些细节上使用的地方,auto*auto&auto 可以自动识别类型,包括指针类型,auto* 强调的是指针类型 auto& 强调的是引用

🌠 例2:

cpp 复制代码
#include <iostream>
using namespace std;

int main() {

	int num = 10;
	auto p = &num;
	//auto* p = num;  // error
	auto* a = &num;
	auto& b = num;

	cout << typeid(p).name() << endl;
	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;

	return 0;
}

auto 不可以在一行定义多个变量。auto a = 1 , d = 4.0;
auto 不能作为函数的参数。void Test(auto a);
auto 不能直接用来声明数组。auto arr[] = {1 , 2 , 3};

auto 的使用场景:

  1. 范围 for 的语法
cpp 复制代码
#include <iostream>
using namespace std;

int main() {

	int arr[] = { 1 , 2 , 3 , 4 , 5 };
	// 正常遍历
	for (int i = 0; i < size(arr); i++) {
		cout << arr[i];
	}
	cout << endl;

	// for范围遍历
	for (auto val : arr) {
		cout << val;
	}
	cout << endl;
	for (auto& val : arr) {
		val++;
	}
	for (auto val : arr) {
		cout << val;
	}

	return 0;
}

ps: valarr 当前每一个元素的拷贝,改变 val 不会影响到数组的元素可以采用 auto& 引用的方式,这样 val 就是数组的每一个元素的引用,方便修改。

  1. 当类型过长的时候可以使用 auto

⭐️ nullptr 关键字

cNULL 的本质是 #define NULL ((void*)0),但是在 c++NULL 的本质是 #define NULL 0,这样可能会有一些不可避免的麻烦。新的代替方式是关键字 nullptr
ps: 在使用 nullptr 表示空指针时,不需要包含头文件,因为 nullptr 是作为 c++11的新关键字。

相关推荐
每次的天空1 小时前
Android学习总结之算法篇五(字符串)
android·学习·算法
愚戏师2 小时前
软件工程(应试版)图形工具总结(二)
数据结构·c++·python·软件工程
owde2 小时前
顺序容器 -forward list单链表
数据结构·c++·list
矛取矛求2 小时前
C++ 标准库参考手册深度解析
java·开发语言·c++
lmy201211082 小时前
GESP:2025-3月等级8-T1-上学
c++·算法·图论·dijkstra
٩( 'ω' )و2602 小时前
stl_list的模拟实现
开发语言·c++·list
&Sinnt&2 小时前
C++/Qt 模拟sensornetwork的工作
c++·qt
奕天者2 小时前
C++学习笔记(三十三)——forward_list
c++·笔记·学习
珊瑚里的鱼2 小时前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
武昌库里写JAVA3 小时前
Golang的消息中间件选型
java·开发语言·spring boot·学习·课程设计