做旅游的网站 是什么风格,郑州网站建设网站建设,wordpress 替换图片函数,台州路桥做网站的公司目录
1、引用
1.1 引用概念
1.2 引用特性
1.3 常引用
1.4 使用场景
1.4.1 引用做参数 1.4.2 引用做返回值
1.5 引用和指针的区别
2、内联函数
2.1 概念
2.2 特性
3、auto关键字
4、基于范围的for循环
5、指针空值nullptr
5.1 C98 中的指针空值处理
5.2 C11 …
目录
1、引用
1.1 引用概念
1.2 引用特性
1.3 常引用
1.4 使用场景
1.4.1 引用做参数 1.4.2 引用做返回值
1.5 引用和指针的区别
2、内联函数
2.1 概念
2.2 特性
3、auto关键字
4、基于范围的for循环
5、指针空值nullptr
5.1 C98 中的指针空值处理
5.2 C11 中 nullptr 的优势 本章节将延续上篇文章未讲完的内容期待接下来的内容哦 1、引用 1.1 引用概念 类型 引用变量名(对象名) 引用实体
void TestRef()
{int a 10;int ra a;//定义引用类型printf(%p\n, a);printf(%p\n, ra);
} ra是a的别名是一个变量占用同一块内存 注意 引用类型 必须和引用 实体 是 同种类型 的 1.2 引用特性 1. 引用在 定义时必须初始化 2. 一个变量可以有多个引用 3. 引用一旦引用一个实体再不能引用其他实体 1.3 常引用 只有引用才涉及权限的变化 1.4 使用场景 1.4.1 引用做参数 输出型参数形参的改变会改变实参 引用做参数不会开辟空间 1.4.2 引用做返回值 引用做返回值不会创建临时变量 1.5 引用和指针的区别 引用语法层面不开空间底层实现和指针类似 面试常考点 2、内联函数 2.1 概念 以 inline 修饰 的函数叫做内联函数 编译时 C 编译器会在 调用内联函数的地方展开 没有函数调用建立栈帧的开销内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的调用 查看方式 1. 在 release 模式下查看编译器生成的汇编代码中是否存在 call Add 2. 在 debug 模式下需要对编译器进行设置否则不会展开 ( 因为 debug 模式下编译器默认不会对代码进行优化以下给出vs2022 的设置方式 ) 2.2 特性 1. inline 是一种 以空间换时间 的做法如果编译器将函数当成内联函数处理在 编译阶段会 用函数体替换函数调用 缺陷可能会使目标文件变大优势少了调用开销提高程序运 行效率。 2. inline 对于编译器而言只是一个建议不同编译器关于 inline 实现机制可能不同 一般建 议将 函数规模较小 ( 即函数不是很长具体没有准确的说法取决于编译器内部实现 ) 、 不 是递归、且频繁调用 的函数采用 inline 修饰否则编译器会忽略 inline特性。下图为《 Cprime 》第五版关于 inline 的建议 问题: 为啥内联函数可能会导致目标文件变大 3. inline 不建议声明和定义分离分离会导致链接错误。因为 inline 被展开就没有函数地址 了链接就会找不到 // F.h
#include iostream
using namespace std;
inline void f(int i);
// F.cpp
#include F.h
void f(int i)
{cout i endl;
}
// main.cpp
#include F.h
int main()
{f(10);return 0;
}
// 链接错误main.obj : error LNK2019: 无法解析的外部符号 void __cdecl
f(int) (?fYAXHZ)该符号在函数 _main 中被引用 内联函数和宏函数 相似点 避免函数调用开销都能在一定程度上避免常规函数调用时的栈帧创建、参数传递等开销提高程序运行效率。 代码替换在编译或预处理阶段都会将相关代码替换到调用处。内联函数由编译器决定是否展开替换宏函数是在预处理阶段进行文本替换。 优缺点 内联函数优点是有类型检查和语法检查增强了程序的健壮性且调试方便缺点是编译器对其展开有条件限制当函数体复杂时可能不进行内联同时会使代码体积增大。 宏函数优点是简单灵活可定义复杂的表达式在代码生成方面有一定的优势缺点是没有类型检查容易出现副作用且在调试时难以定位问题也可能导致代码可读性变差。 3、auto关键字 使用 auto 定义变量时必须对其进行初始化在编译阶段编译器需要根据初始化表达式来推导 auto 的实际类型 。因此 auto 并非是一种 “ 类型 ” 的声明而是一个类型声明时的 “ 占位符 ” 编译器在编 译期会将 auto 替换为变量实际的类型 。 4、基于范围的for循环 void TestFor1()
{int array[] { 1, 2, 3, 4, 5 };//让数组中的元素大小变成原来的二倍for (int i 0; i sizeof(array) / sizeof(array[0]); i)array[i] * 2;//打印数组元素for (int* p array; p array sizeof(array) / sizeof(array[0]); p)cout *p endl;
}void TestFor2()
{int array[] { 1, 2, 3, 4, 5 };//让数组中的元素大小变成原来的二倍for (auto e : array)e * 2;//打印数组元素for (auto e : array)cout e ;}int main()
{TestFor2();return 0;
} 5、指针空值nullptr 5.1 C98 中的指针空值处理 初始化方式 在 C/C 编程里为避免未初始化指针带来的错误习惯给指针合适初值。在 C98 中当指针无合法指向时常见初始化方式 NULL的本质 NULL 本质是宏在传统 C 头文件 stddef.h 中定义如下 即 NULL 可能被定义为字面常量 0 或无类型指针 (void*) 的常量 。 使用 NULL 的麻烦 这里 f(0) 调用 f(int) 没问题但 f(NULL) 由于 NULL 定义的模糊性既像 0 又像指针可能导致编译器匹配混乱而 f((int*)NULL) 虽然明确转化为指针类型调用 f(int*) 但这种写法不够简洁直观 。 5.2 C11 中 nullptr 的优势 无需额外头文件 nullptr 是 C11 引入的新关键字专门表示指针空值 。使用它时无需包含额外头文件代码简洁性提升。 字节数特性 在 C11 中sizeof(nullptr) 与 sizeof((void*)0) 所占字节数相同 。这意味着 nullptr 在内存占用等底层特性上和传统表示空指针的方式在字节层面有对应关系。 提升代码健壮性 相比 NULL 可能带来的歧义nullptr 明确表示指针空值。在函数重载等场景下能让编译器准确匹配函数减少错误发生概率使代码更健壮。例如之前的 f 函数调用使用 nullptr 就很明确 总结来说nullptr 作为 C11 的新特性解决了 C98 中 NULL 表示指针空值的一些弊端让指针空值的表达更清晰、准确有助于写出更可靠的代码