ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

C++基础(二) 了解引用、inline、nullptr

C++基础(二) 了解引用、inline、nullptr 前言这篇我们继续学习C基础。目录一.引用1.1 引用的概念和定义1.2 引用的特性1.3 引用的使用1.4 const引用1.5 指针和引用的关系二.inline三.nullptr结束语一.引用1.1 引用的概念和定义1.2 引用的特性引用在定义时必须初始化。一个变量可以有多个引用。引用一旦引用一个实体再不能引用其他实体。#includeiostream using namespace std; int main() { int a 30; int c 20; //int ra; //报错引用必须初始化 int b a; int d b; b c; //这里不是b引用cC引用不能改变指向这里是看作赋值 cout a endl; cout b endl; //证明a,b共用一个内存空间 return 0; }1.3 引用的使用1.4 const引用#includeiostream using namespace std; int test() { return 10; } int main() { const int a 30; int c a;//权限放大可读可写引用只读不写 const int d a;//可以 int b 10; const int e b;//权限缩小可以且不影响b本身的权限 int aa 10; int aa1 (b 20); int aa2 test(); int aa3 3.14; //为什么这些都会报错呢因为类型转换、值返回、表达式会涉及临时变量 //临时变量具有常性所以必须用const引用给常量取引用也是如此。 return 0;具体我们可以这样理解:也许有人会问既然aa1引用的是临时变量那当临时变量销毁时aa1不会出现什么问题吗这一点我们不需要担心只有用const引用常量引用绑定临时变量时临时变量的生命周期才会和这个const引用aa1绑定会跟着aa1的销毁而销毁如果是普通的非const引用根本无法直接绑定临时变量代码会直接编译报错。1.5 指针和引用的关系二.inline这里我重点解释一下最后一点inline函数不建议声明和定义分离原因在于inline函数需要在调用点展开代码而这一操作发生在编译阶段编译器必须看到函数的完整定义才能完成展开如果调用时只找得到声明、看不到定义不仅无法实现内联优化还会在链接阶段因找不到函数实体而报 undefined reference 错误。三.nullptr我们先来看一张图我们可以这样理解#ifndef NULL 检查 NULL 宏是否未被定义避免重复定义预处理阶段的条件编译。#ifdef __cplusplus 检查是否为C编译环境 __cplusplus 是C编译器自动定义的宏。#define NULL 0 C环境中 NULL 被定义为整数 0 。原因C不允许 void* 直接隐式转换为其他指针类型用 0 作为空指针常量编译器会自动将 0 转换为对应类型的空指针。#else 进入C语言编译环境分支。#define NULL ((void *)0) C语言环境中 NULL 被定义为 void* 类型的空指针强制转换 0 为无类型指针。原因C支持 void* 隐式转换为任意指针类型 (void *)0 是标准的C语言空指针表示。#endif 闭合对应的条件编译块完成 NULL 的条件定义。我们想如果编译器会自动将0转换为对应类型的空指针为什么还需要nullptr呢因为NULL在函数重载、模板推导、类型分区等场景下有歧义问题。举个例子#includeiostream using namespace std; void f(int x) { cout f(int x) endl; } void f(int* x) { cout f(int* x) endl; } int main() { f(0); f(NULL); return 0; }我们再来看看nullptr:#includeiostream using namespace std; int main() { int a NULL; int* b NULL; int c nullptr;//失败 int* d nullptr; return 0; }结束语C基础到这就全部学完了下一篇我们学习类和对象。感谢您的浏览如若发现术语或者代码有问题欢迎在评论区指出。传送门C基础一 类和对象全
返回列表