Cpp02 — 内联函数、auto关键字、范围for、nullptr

news2024/11/16 19:38:58

前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。

因为是个人复习,会有部分压缩和省略。

一、内联函数

C语言为了减少小函数的栈帧开销,提供了宏函数,会在预处理阶段展开。

既然C语言已经解决了这种问题,为什么C++还要提供inline函数呢?(宏函数的缺点)

1.宏函数不支持调试(内联在debug模式下默认不可调试,需要设置一下)

2.宏函数语法复杂,容易出错(例如用宏实现一个加法)

3.宏函数没有类型安全的检查

因此,C++推荐把频繁调用的小函数,定义成inline,其会在调用的地方展开,没有栈帧开销

能不能所有函数都搞成内联?

例如这里有一个sort函数有100行指令 ,有10个地方调用,总计是多少指令?

有110条。

如果搞成内联函数,有多少条?

100*10,有1000条指令。

指令变多意味着编译出来的可执行程序变大,内存消耗变多,会使人们的体验变差

内联函数的特性:

1. inline是一种以空间换时间的做法,省去了调用函数的额外开销。(代码很长或有循环或递归的函数不适宜作为内联函数)

2. inline对编译器只是一个建议,编译器会自动优化,如果函数不符合要求,编译器不会将其设为内联。
3. inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。

会发生链接错误的根本原因:内联函数没有地址

直接在类里面定义实现的成员函数,默认就是内联函数

class A
{
    public:
        void func()
        {
            cout << "A" << endl;
        }
    private:
        int a;
};

二、auto

auto可以根据变量的类型自动确定自己所定义变量的类型

#include <map>
#include <string>
#include <iostream>
using namespace std;

int main()
{

    int a = 10;
    //int b = a;
    auto b = a;//类型声明成auto,可以根据a的类型自动推导b的类型
    map<string, string> m;
    //map<string, string>::iterator it = m.begin();
    //这里可以根据m.begin()自动推导it的类型是map<string, string>::iterator
    auto it = m.begin();

    return 0;
}

 auto有几个地方不能使用:

1.auto不能作为函数的参数

auto不能作为形参类型,因为编译器无法对a的实际类型进行推导

void test(auto a)
{}

2.auto不能直接用来声明数组

void test()
{
    int a[] = {1,2,3};
    auto b[] = {4,5,6};
    //那么可以这样吗?在创建数组时,auto b[0] = a[1];
        auto a = 4.1,b = 4;//也不可以
}

3.auto不能用于强制类型转换

三、范围for

auto真正的意义在于支持C++11的新语法范围for,新语法遍历,更简单,是数组都可以,容器也可以。范围for可以自动遍历,依次取出元素赋值给e,直到结束(e的名字可以改变)

如果想通过范围for改变数据,需要加上&

范围for的使用条件
1. for循环迭代的范围必须是确定的
对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。注意:以下代码就有问题,因为for的范围不确定,int array[]表示的不是一个数组,它是一个指针,所以不行

2. 迭代的对象要能实现++和==的操作。(关于迭代器这个问题,以后会写)

四、nullptr和NULL

在C++中我们使用nullptr,因为C++中NULL其实是被定义成0的

程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。 
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下是将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/798018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpingBoot整合Swagger和Hibernate-Validate练习

需求&#xff1a;用SpingBootSwaggerHibernate-Validate集成一个demo&#xff0c;用Swagger查看Controller的接口文档。Swagger接口包括Controller的请求和返回&#xff0c;用Hibernate-Validate校验Controller的请求参数的合法性。目前只需要校验非空即可。 1.新建一个Springb…

python 将pdf文件转图片

有小伙伴问了怎么将 pdf文件转图片的问题&#xff0c;我百度了一波儿&#xff0c;搞了以下python代码给他封装成exe工具了。 中途打包踩了个坑&#xff0c;python进程池的问题&#xff0c;本地运行没啥问题&#xff0c;打包好的exe文件双击就会使电脑内存爆破卡死&#xff0c;…

IT行业有哪些工资高、又有前景的岗位?

“IT行业涵盖了广泛的职位和领域&#xff0c;其中一些职位包括软件工程师、系统管理员、数据库管理员、网络工程师、UI/UX设计师、移动应用开发者、项目经理、IT顾问和技术支持工程师等” ——高薪岗位 那么&#xff0c;岗位如此之多&#xff0c;如何选择学习方向呢&#xff1…

蓝牙耳机啥牌子好?经销商盘点线下热销蓝牙耳机排行榜

经营蓝牙耳机已经三年了&#xff0c;随着蓝牙耳机的普及&#xff0c;蓝牙耳机已成为人手必备&#xff0c;很多朋友在挑选时会咨询我的意见&#xff0c;不知道蓝牙耳机啥牌子好&#xff0c;为此我整理了店铺内热销蓝牙耳机排行榜&#xff0c;想知道实体店铺哪些蓝牙耳机品牌最受…

面向对象编程:深入理解内部类与抽象类的使用

文章目录 一、内部类使用&#xff1a;1.1 成员内部类&#xff1a;1.1.1 成员内部类的主要特点是&#xff1a; 1.2 局部内部类&#xff1a;1.2.1 局部内部类的主要特点是&#xff1a;1.2.2 局部内部类通常用于以下情况&#xff1a; 1.3 静态内部类&#xff1a;1.3.1 静态内部类的…

微服务01,初始,拥抱他,最后爱上他,mmm

俗话说乱花渐欲迷人眼&#xff0c;学习微服务应该从哪开始学呢 从这张表去学微服务 微服务全家桶&#xff1a;走进 Spring Cloud 的世界 了解 Spring Cloud 框架的功能定位&#xff0c;以及它和 Spring Boot 之 间的关系。除此之外&#xff0c;我还会详细讲解 Spring Cloud 的…

KMP算法的及其原理

KMP算法 首先 我们先了解一下 KMP算法的作用 str1 和str2 字符串 如果str1中包含str2 那么返回头位置 如果不包含返回-1 首先 我们先加入一个概念: 有一个next数组 next[i]的值为 str2 中 以i-1位置为结尾的字符串中 最长相同前缀后缀为多长(相同前缀后缀 不是对称 aba 中相…

数字化转型与百数低代码平台:创新商业模式的商机突破口

随着科技的不断进步和全球经济的快速发展&#xff0c;企业数字化转型已经成为当今商业领域的热门话题。 根据Gartner的《2023年度董事会调查》显示&#xff0c;数字化转型已然是当今企业商业战略的一大基石&#xff0c;中国有36%的企业将数字化转型作为企业最优先的业务。 这表…

windows环境下,安装elasticsearch

jdk ElasticSearch是基于lucence开发的&#xff0c;也就是运行需要java jdk支持。 我下载了 elasticsearch-8.9.0-windows-x86_64.zip&#xff0c;带了OpenJDK。 ElasticSearch下载 https://www.elastic.co/downloads/elasticsearch 安装ElasticSearch 下载安装包后解压 修…

WMS仓储管理系统的建设理念包括哪些内容

WMS仓储管理系统是物流供应链管理领域中的重要组成部分&#xff0c;主要用于仓储过程的计划、控制和管理。WMS仓储管理系统解决方案可以有效协调人、设备和仓库资源&#xff0c;提高仓储效率、降低成本、确保准确性&#xff0c;为企业的物流运输及整个生产活动提供有力保障。那…

综合案例(面向对象)

使用面向对象思想完成数据读取和处理基于面向对象思想重新认知第三方库使用&#xff08;PyEcharts&#xff09; 数据分析案例 某公司&#xff0c;有2份数据文件&#xff0c;现需要对其进行分析处理&#xff0c;计算每日的销售额并以柱状图表的形式进行展示。 数据内容 综合案…

【Terraform学习】Terraform-docker部署快速入门(快速入门)

Terraform-docker部署快速入门 实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中&#xff0c;单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分&#xff0c;为角色选择可信实体类型&#xff1a; AWS 服务 使用案例:EC2 单击下一步 添加权限&#x…

LeetCode面向运气之Javascript—第2600题-K件物品的最大和-94.68%

LeetCode第2600题-K件物品的最大和 题目要求 袋子中装有一些物品&#xff0c;每个物品上都标记着数字 1 、0 或 -1 。 四个非负整数 numOnes 、numZeros 、numNegOnes 和 k 。 袋子最初包含&#xff1a; numOnes 件标记为 1 的物品。numZeroes 件标记为 0 的物品。numNegOn…

【GitOps系列】使用 ArgoCD 快速打造GitOps工作流

文章目录 ArgoCD简介ArgoCD安装访问ArgoCDGitOps 工作流总览创建 ArgoCD 应用检查 ArgoCD 同步状态访问应用 连接 GitOps 工作流体验 GitOps 工作流生产建议1&#xff09;修改默认密码2&#xff09;配置 Ingress 和 TLS3&#xff09;使用 Webhook 触发 ArgoCD4&#xff09;将源…

【C++】开源:Boost网络库Asio配置使用

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Asio网络库配置使用。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次…

手机怎么把网址转二维码?网址活码手机端制作教学

相信很多小伙伴都知道电脑生成网址二维码方法&#xff0c;只需要利用二维码生成器&#xff08;二维码生成器-手机二维码制作生成器-免费在线生成二维码-机智熊二维码&#xff09;的网址生成二维码功能&#xff0c;就可以轻松将网址生成二维码。那么大家知道在手机上怎么操作吗&…

兴达易控CANopn 主站转 profinet 网关的网关配置及操作

兴达易控CANopn 主站转 profinet 网关&#xff08;XD-COPNm20&#xff09;做为 PROFINET 网络的 Device 设备&#xff08;即从站&#xff09;&#xff0c;带 2 个 RJ45 以太网接口&#xff0c;支持100BASE-TX&#xff0c;MDI/MDIX 自检测&#xff0c;集成以太网交换机&#xff…

Jenkins 拉取 GitHub 私有仓库失败问题

添加仓库的时候提示 stderr: fatal: Cannot prompt because user interactivity has been disabled. 把在 GitHub账户设置中生成的个人访问令牌填到地址里

使用docker搭建nacos

使用docker搭建nacos docker搭建最新版nacosMySQL下简历nacos配置数据表拉取镜像创建挂载目录启动容器访问nacos docker搭建nacos 2.0版本 docker搭建最新版nacos 最近想在自己服务器上搭建一个nacos服务&#xff0c;以前一直在本地的windows上使用&#xff0c;而且使用着naco…

Rabbitmq的安装与使用(Linux版)

目录 Rabbitmq安装 1.在Ubuntu上安装RabbitMQ&#xff1a; 打开终端&#xff0c;运行以下命令以更新软件包列表&#xff1a; 安装RabbitMQ&#xff1a; 安装完成后&#xff0c;RabbitMQ服务会自动启动。你可以使用以下命令来检查RabbitMQ服务状态&#xff1a; 2.在CentOS…