从C到C++ | C++入门(三)

news2024/11/25 23:23:19

目录

内联函数

auto 关键字

范围for 

指针空值nullptr


内联函数

以inline修饰的函数叫内联函数,编译时C++编译器会在调用函数的地方展开,没有函数调用建立栈帧的开销,可提升程序的运行效率。

        例子:

#include <iostream>
using namespace std;
//   内联函数
inline int Add(int x, int y)
{
    return x + y;
}

int main()
{
    int ret = 0;
    ret = Add(1,2);
    cout << ret;
    return 0;
}

而上面的程序在运行的时候并不存在调用函数名为Add()的栈帧,编译器的编译的时候将其展开了(release模式下) 。

inline支持声明和定义分离,但是不建议inline函数采用声明和定义分离的写法,因为当inline函数被展开后,是没有函数地址的,容易发生错误

        注意:

inline 的作用有点类似C语言中的#define(宏),  但其比#define(宏) 更优秀,inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同。为何说是一个建议?假如用inline修饰递归函数,或者修饰频繁调用的函数,或者修饰多行代码的函数,编译器会自动忽略inline这个特性。

在《Effective C++ Second Edition》的条款1中,建议尽量用inline而不是用#define: 

auto 关键字

在早期c/c++中auto的含义是,使用auto修饰的变量,是具有自动存储器的局部变量,但使用热度并不高,在C++11中,C++标准委员会赋予了auto全新的含义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的便必须由编译器在编译时推导而得。

简而言之就是,auto可以自动推导变量的类型。在后续学习C++的过程中,随着程序越来越复杂,程序中用到的类型也会越来越复杂,例如 "std::vector<int>::const_iterator it = v1.begin()"等等语句。

        例子:

#include <iostream>
using namespace std;
int main()
{
    int a = 0;

    // 10 是int类型,因此此处的auto在编译的时候自动推导为int
    auto b = 10;
    // &a 是指向int变量的指针类型,因此此处的auto在编译的时候自动推导为int* 
    auto ptr = &a;
    // 若是想引用某个变量实体的话,需要在"加上&"   
    auto& c = a;

    return 0;
}

        注意:

auto不能作为函数的参数(C++20之前)。

auto崩直接用来声明数组。

为了避免于C++98中的auto发生混淆,C++11中只保留了auto作为类型指示符的用法。

范围for 

在C++11中,C++引入了基于范围的for循环。可以使用范围for来遍历数组、string、vector、list等等,for循环后的括号用冒号 " : " 分为两部分:第一部分是范围内用于迭代的变量,第二部分则是表示被迭代的范围。

        例子:

#include <iostream>
using namespace std;
int main()
{
	int a[] = {1,2,3,4,5,6,7,8,9};
    //for (int e : a)
	for (auto e : a)
	{
		cout << e << " ";
	}
	cout << endl;
    return 0;
}

指针空值nullptr

在C语言中,如果要给一个指针赋予空值,采用的做法是将其赋值为NULL,例如 " int* ptr = NULL;"。

实际上,NULL是一个宏,在C语言的头文件(stddef.h)中可以找到" #define NULL 0",NULL可能会被定义为字面常量0,或者被定义为无类型指针的常量,但是这种行为在某些程序下会存在一些问题,因此在C++11中,C++引入了指针空值这个概念,为了提高代码的健壮性,在后续表示指针空值的时候建议最好使用nullptr而不是NULL。

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

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

相关文章

使用JMeter进行接口测试教程

安装 使用JMeter的前提需要安装JDK&#xff0c;需要JDK1.7以上版本目前在用的是JMeter5.2版本&#xff0c;大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin&#xff0c;双击jmeter.bat启动运行 启动后默认为英文版本&#xff0c;可通过Options – Ch…

RISCV - 2 “Zicsr“, CSR Instructions

RISCV - 2 “Zicsr“, CSR Instructions 1 CSR Instructions2 CSR Access Ordering3 CSR指令集类型 CSR&#xff1a;Control and Status Register RISCV - 1 RV32/64G指令集清单 RISC-V defines a separate address space of 4096 Control and Status registers associated w…

Java集合之Map

HashMap集合 HashMap的特点 HashMap的常用方法 ①.put(K key, V value) 将键&#xff08;key&#xff09;/值&#xff08;value&#xff09;映射存放到Map集合中 public class Test {public static void main(String[] args) {HashMap<String, Integer> map new Hash…

Python入门【生成器推导式创建元组、字典、字典元素添加、修改、删除、序列解包、字典核心底层原理、集合 】(六)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

HTML :深入了解超文本标记语言

文章目录 前言HTML 简介HTML 基本结构HTML 标记HTML 文本标记HTML 图像标记HTML 链接标记 HTML 表单HTML 表格HTML 列表HTML 媒体元素HTML 语义化 前言 欢迎来到本篇博客&#xff0c;我将带你深入了解 HTML&#xff08;超文本标记语言&#xff09;。作为前端开发的基础&#x…

论文工具——ChatGPT结合PlotNeuralNet快速出神经网络深度学习模型图

文章目录 引言正文PlotNeuralNet安装使用使用python进行编辑使用latex进行编辑 样例利用chatGPT使用chatGPT生成Latex代码利用chatGPT生成对应的python代码 总结引用 引言 介绍如何安装PlotNeuralNet工具&#xff0c;并结合chatGPT减少学习成本&#xff0c;快速出图。将按照软…

06-Vue基础之事件处理

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Cloudreve搭建云盘系统,并实现随时访问

文章目录 1、前言2、本地网站搭建1.环境使用2.支持组件选择3.网页安装4.测试和使用5.问题解决 3、本地网页发布1.cpolar云端设置2.cpolar本地设置 4、公网访问测试5、结语 1、前言 自云存储概念兴起已经有段时间了&#xff0c;各互联网大厂也纷纷加入战局&#xff0c;一时间公…

LabelImg 标注工具的使用

目录 1 安装及使用1.1 安装1.2 使用 2 标注格式 1 安装及使用 1.1 安装 Win R输入cmd进入终端界面 LabelImg 安装命令&#xff1a; pip install labelimg没有配置国内 pip 源的&#xff0c;请看 ⇒ \Rightarrow ⇒ 临时办法&#xff1a;在上述命令末尾添加源&#xff0c…

详解C语言自定义类型(结构体,枚举,联合)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 自定义类型 1.结构体1.1 …

【GUI】使用PID控制器进行台式过程控制实验,以保持热敏电阻的温度(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码、操作说明 &#x1f4a5;1 概述 本实验是温度控制的反馈控制应用。特别是&#xff0c;本实验讲解&#xff1a; 手动和自动控制的区别 生成动态数据的 步进测试 拟合动态数…

【动态规划part05】| 1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零

目录 &#x1f388;LeetCode 1049.最后一块石头的重量|| &#x1f388; LeetCode494. 目标和 &#x1f388;LeetCode 474.一和零 &#x1f388;LeetCode 1049.最后一块石头的重量|| 链接&#xff1a;1049.最后一块石头的重量 有一堆石头&#xff0c;用整数数组 stones 表示…

深入理解 PostgreSQL 的架构和内部工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

HTML渐变效果:线性渐变与径向渐变详解

简介 在HTML中,你可以使用CSS来创建渐变效果,给元素添加丰富的背景样式。本文将详细介绍HTML中的渐变效果,并提供示例代码帮助你理解和应用。 线性渐变(Linear Gradient) 线性渐变通过沿一条直线给元素应用颜色的渐变效果。你可以定义起始点和结束点之间的颜色过渡方式。…

西门子plc的通信联网不同网段通讯

你是否曾经遇到过需要将不同品牌的PLC数据进行交换的情况&#xff1f;今天我们要介绍的就是远创智控YC8000-PN的ModbusTCP客户机功能&#xff0c;它可以帮助你实现这一需求。 1, 远创智控YC8000-PN的lan1口连接西门子S7-1200的网口&#xff0c;FX5U自带以太网口与远创智控YC8…

JVM-Java虚拟机

JVM——Java虚拟机&#xff0c;是Java实现平台无关性的基石。 基本概念&#xff1a;JVM 是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、 一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与…

linux中cgroup的简单使用

文章目录 1 简介1.1 主要功能1.2 cgroups子系统 2 绑定进程到指定cpu核数3 限制进程cpu使用率3.1 示例13.2 示例2 4 限制内存使用量5 限制磁盘读取速度 1 简介 Linux CGroup全称Linux Control Group&#xff0c; 是Linux内核的一个功能&#xff0c;用来限制&#xff0c;控制与…

fastadmin 项目gitee管理

gitee创建一个仓库使用sourcetree等工具拉取代码使用phpstorm远程同步代码到本地设置忽略代码文件 注意&#xff1a;如果是直接把远程代码同步到本地&#xff0c;默认是你在 .gitignore中设置是无效的&#xff0c;代码一样会提交&#xff0c;需要先使用上面的截图去掉缓存&…

进程控制学习笔记

文章目录 进程退出孤儿进程僵尸进程进程回收waitpid()函数 进程退出 子进程的退出需要父进程对其资源的释放&#xff0c;子进程只能对用户区的数据进行释放&#xff0c;无法完成对内核区的释放。 可以获取到。 两个退出的区别&#xff1a; 系统调用不会刷新缓冲区&#xff…

【人工智能】神经网络、M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义、总代价

M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义 文章目录 M-P_神经元模型、激活函数、神经网络结构、学习网络参数、代价定义M-P 神经元模型激活函数(Activation function)神经网络结构举例训练神经网络学习网络参数代价定义均方误差交叉熵(Cross Entropy)…