【C++之语法篇003】
C++学习笔记---003
- C++知识开篇
- 1、内联函数
- 1.1、什么是内联函数?
- 1.2、解决外部头文件,重复定义问题
- 1.3、内联函数的总结
- 2、auto关键字
- 2.1、auto的作用
- 2.2、auto的总结
- 3、范围for
- 3.1、什么是范围for?
- 3.2、范围for的循环应用
- 4、指针空值关键字nullptr
- 4.1、指针空值的作用
C++知识开篇
前言:
前篇内容对于C++有一个基本认识,这篇文章将继续学习C++与C语言优化后的语法知识部分。
/知识点汇总/
1、内联函数
1.1、什么是内联函数?
概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序的运行效率。
C++引出inline关键字
比如这个函数频繁调用100万次,如何解决?
C语言中就引用的宏,宏函数解决。但是要求细节和严谨。
inline常用于修饰频繁调用的函数
#include <iostream>
using namespace std;
//int Add(int left, int right)
//{
// return left + right;
//}
inline int Add(int left, int right)
{return left + right;
}
int main()
{int ret = 0;ret = Add(1, 2);//汇编call --》Add (地址:...)//inline修改后,成为内联函数。就直接调用函数不用call Add()函数了。return 0;
}
C++引出内联函数主要是用于解决C语言中宏函数容易出现的问题。
回顾:宏或宏函数,使用宏根本上需要注意的就是括号的正确使用。
1.宏的本质就是预处理阶段的替换。
2.宏本身不是函数
3.不需要分号
4.括号优先级
#include <iostream>
#define ADD(a,b) ((a)+(b))
//为什么宏要加里面的括号?
//因为a和b也可能是独立的表达式。否则,容易出现优先级问题错误。
using namespace std;
int main()
{int a = 0;cin >> a;//场景1if (ADD(a, 2)){}//场景2int m = ADD(a, 2) * 3;cout << m << endl;return 0;
}
宏的缺点:
1.不容易控制,不容易调试
2.语法复杂,坑多易错
3.没有类型,无法安全检查
对比C++的inline和C语言的宏
可见C++的内敛函数很好的解决此类大部分问题。
1.2、解决外部头文件,重复定义问题
1.声明和定义分离
2.static,修改函数链接属性,只在当前文件可用。(适用于大函数)
3.inline,使其展开就无法call调用。(适用于小函数)
#include <iostream>
using namespace std;
inline int Add(int a, int b)
{cout << "int Add(int a,int b)" << endl;return a + b;
}
int main()
{Add(2, 3);return 0;
}
1.3、内联函数的总结
1.inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用
缺陷:可能是目标文件夹变大,优势:少了很多调用花销,提高程序运行效率。
2.inline对于编译器而言只是一个小建议,不同编译器关于inline实现机制可能不同;一般建议将函数规模较小,不是递归且频繁调用的函数采用inline修饰。
3.内敛说明只是向编译器发出请求,编译器可以选择忽略这个请求。
4.inline不建议声明和定义分离,分离会导致链接错误,因为inline被展开,就没有Call函数地址了,所以链接就找不到了。
2、auto关键字
2.1、auto的作用
auto会自动推导类型
但是auto同样存在一定的弊端:
1.首先适用于自己知道的类型,如果单纯的只有auto没有注释和文档说明,就比较影响程序的可读性;
2.因为要去推导auto接收的类型,嵌套太多的时候就很影响代码的阅读性。
#include <iostream>
#include <map>
#include <string>
using namespace std;int Add(int a, int b)
{cout << "int Add(int a,int b)" << endl;return a + b;
}
auto func(int a, int b)
{auto m = a + b;return m;
}
int main()
{int i = 0;int j = i;auto k = i;//自动判定接收为整型。//auto x; //auto与引用一样必须初始化auto p1 = &i; //自动判定接收的地址为指针类型。auto* p2 = &i; //指定为指针类型//auto* p3 = i; //错误使用auto& r = i;//常见的应用于复杂的类型://函数指针/数组指针int(*pf)(int, int) = Add;//等价auto自动识别为函数指针auto pf2 = Add;//C++使用场景cout << typeid(pf).name() << endl;cout << typeid(pf2).name() << endl;std::map<std::string, std::string> dict;//std::map<std::string, std::string>::iterator it = dict.begin();//等价auto it = dict.begin();//注意:auto建议不能作参数,另外auto可以但不建议作函数返回值,嵌套太多不好判断类型。auto ret = func(1, 2);//auto嵌套的谨慎使用return 0;
}
2.2、auto的总结
注意:auto不能作返回值,另外auto可以但不建议作函数返回值,嵌套太多不好判断类型。
但是auto同样存在一定的弊端:
1.首先适用于自己知道的类型,如果单纯的只有auto没有注释和文档说明,就比较影响程序的可读性;
2.因为要去推导auto接收的类型,嵌套太多的时候就很影响代码的阅读性。
3、范围for
3.1、什么是范围for?
C++引入的范围for由括号里的两部分组成,以冒号分割,冒号前是用于迭代的变量,冒号后是被迭代的范围。
格式:
for (类型(引用) 变量 : 范围)
{}
3.2、范围for的循环应用
#include <iostream>
using namespace std;
int main()
{int arr[] = { 1,2,3,4,5 };//C语言的for循环for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){arr[i] *= 2;}for (int* p = arr; p < p + sizeof(arr) / sizeof(arr[0]); p++){cout << *p << endl;}//C++//依次取得数组中元素的值赋值给变量e,并且自动迭代,直到自动判断遍历结束//for (auto e : arr)//{// cout << e << " ";//}//不加引用是无法修改数组元素的值的,因为属于临时拷贝,所以需要加上别名才能修改元素值for (auto& e : arr){e *= 2 ;}cout << endl;for (auto e : arr){cout << e << " ";}cout << endl;return 0;
}
数组名作为参数时,范围无法明确,就无法使用范围for
#include <iostream>
using namespace std;
//注意:这里看似传的数组,但是数组作为参数本质就是转换为指针了;
//所以范围无法明确,自然就无法使用范围for了。
void func(int arr[])
{for (auto e : arr){cout << e << " ";}cout << endl;
}
int main()
{return 0;
}
总结:
1.范围for的使用范围是明确的;
2.可以正常的使用continue和break
4、指针空值关键字nullptr
4.1、指针空值的作用
引用新的nullptr,解决了C++本身自己的底层定义NULL语法时的错误
#include <iostream>
using namespace std;void f(int)
{cout << "f(int)" << endl;
}void f(int*)
{cout << "f(int*)" << endl;
}int main()
{f(0);f(NULL);f(nullptr);//等价//f((void*)0);//所以指针初始化就采用nullptr了int* p = nullptr;return 0;
}
相关文章:
【C++之语法篇003】
C学习笔记---003 C知识开篇1、内联函数1.1、什么是内联函数?1.2、解决外部头文件,重复定义问题1.3、内联函数的总结 2、auto关键字2.1、auto的作用2.2、auto的总结 3、范围for3.1、什么是范围for?3.2、范围for的循环应用 4、指针空值关键字nullptr4.1、…...

Github代码仓库SSH配置流程
作者: Herman Ye Auromix 测试环境: Ubuntu20.04 更新日期: 2024/02/21 注1: Auromix 是一个机器人爱好者开源组织。 注2: 由于笔者水平有限,以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…...

Arrays工具类的常见方法总结
一、Arrays.asList( ) 1.作用:Arrays.asList( )方法的作用是将数组转换成List,将List中的全部集合对象添加至ArrayList集合中 2.参数:动态参数 (T... a) 3.返回值:List 集合 List<T> 4.举例: package com…...
物联网和人工智能的融合
物联网和人工智能的融合 1. 物联网和人工智能的融合2. 芯片技术的进步3. 安全和隐私保护挑战4. 软件开发和调试技术的创新5. 自动化和智能化趋势 1. 物联网和人工智能的融合 随着物联网和人工智能技术的快速发展,嵌入式系统将更多地与物联网设备和人工智能算法相结…...
【微信小程序】wxss 和 css 、wxml 和 html 区别
wxss 和 css 区别 wxss 支持小程序特有的选择器和 样式属性 scroll-into-view cover-view 等wxss 引入了 rpx 单位,可以根据屏幕宽度进行自适应,使得开发者可以更方便的处理不同尺寸屏幕的适配问题。wxss 背景图片只能引入外链,不能使用本地…...

python统计分析——使用AIC进行模型选择
参考资料:用python动手学统计学 1、导入库 # 导入库 # 用于数值计算的库 import numpy as np import pandas as pd import scipy as sp from scipy import stats # 用于绘图的库 import matplotlib.pyplot as plt import seaborn as sns sns.set() # 用于估计统计…...

Android 11以上获取不到第三方app是否安装
开年第一篇,处理了一下年前的小问题。 问题:本地app跳转到第三方app地图进行导航,获取不到第三方地图是否安装。 解决: 1.添加包名 This can be done by adding a <queries> element in the Android manifest.在app下的…...

Java的编程之旅24——private私有方法
1.private的介绍 在面向对象编程中,private是一种访问修饰符,用于限制成员的访问范围。私有成员只能在所属的类内部访问,对外部的类或对象是不可见的。 private的使用可以带来以下几个好处: 封装实现细节:私有成员可…...

为什么在MOS管开关电路设计中使用三极管容易烧坏?
MOS管作为一种常用的开关元件,具有低导通电阻、高开关速度和低功耗等优点,因此在许多电子设备中广泛应用。然而,在一些特殊情况下,我们需要在MOS管控制电路中加入三极管来实现一些特殊功能。然而,不同于MOS管ÿ…...

CSS的注释:以“ /* ”开头,以“ */ ”结尾
CSS的注释:以“ /* ”开头,以“*/”结尾 CSS的注释: 以“ /* ”开头,以“ */ ”结尾 在CSS中,注释是一种非常重要的工具,它们可以帮助开发者记录代码的功能、用法或其他重要信息。这些信息对于理解代码、维护代码以及与他人合作都…...
MySQL中常见的几种日志类型【重点】
在MySQL中,有几种不同类型的日志,用于记录数据库的活动和操作,以便于故障排查、性能调优和数据恢复等目的。以下是MySQL中常见的几种日志类型: 错误日志(Error Log): 错误日志记录了MySQL服务器…...

odoo16-API(Controller)带有验证访问的接口
odoo16-API(Controller)带有验证访问的接口 目前我使用odoo原生的登录token来验证登陆的有效性 废话不多说直接上代码 # 测试获取session_id import requests class GetOdooData(http.Controller):def getOdooToken(self):# http://localhost:8123访问…...

Eclipse项目间的引用
我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门…...
matplotlib使用案例3:通过自定义图例类实现图例的任意方向(行 or 列)的排列
这个方法的核心依然是基于matplotlib.legend._get_legend_handles_labels函数。然后将得到的handlers, labels进行重排,使得即使再调用Legend类的绘制方法对图例进行列排列,最终的效果也是图例的行显示,如[1、2、3、4、5、6],当指定ncols=2,Legend类的绘制方法得到的图例如…...

js设计模式:依赖注入模式
作用: 在对象外部完成两个对象的注入绑定等操作 这样可以将代码解耦,方便维护和扩展 vue中使用use注册其他插件就是在外部创建依赖关系的 示例: class App{constructor(appName,appFun){this.appName appNamethis.appFun appFun}}class Phone{constructor(app) {this.nam…...
【性能最佳实践】事务处理和读写策略原来这么关键!
MongoDB针对初级,中级及熟练的技术开发人员推出系列技术文章与行业案例。深入浅出地剖析MongoDB产品基础原理,使用技巧,典型行业场景及应用,还有Code Demo及线上线下活动推荐! 欢迎阅读有关MongoDB性能最佳实践的系列…...

【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子
作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示,其中每个元素可以是墙、地板或…...

开店怎么做进销存
开设一家店铺,无论是实体店还是网店,进销存管理都是确保店铺正常运营和盈利的关键环节。一款良好的进销存管理软件可以帮助你更好地掌握库存情况、优化采购策略、提高销售效率,并最终实现盈利目标。那么,开店怎么做进销存管理呢&a…...

UE4 C++联网RPC教程笔记(三)(第8~9集)完结
UE4 C联网RPC教程笔记(三)(第8~9集)完结 8. exe 后缀实现监听服务器9. C 实现监听服务器 8. exe 后缀实现监听服务器 前面我们通过蓝图节点实现了局域网连接的功能,实际上我们还可以给项目打包后生成的 .exe 文件创建…...
程序员一定要远离“钻研技术无用,搞钱才是正道”的言论
不知道大家有没有刷到过这样的言论: "程序员真的不要花大量时间研究底层代码,技术钻研的再高级再牛也逃不过被优化的下场。 前辈们开发一个功能用一天,我开发一个功能得用一个星期,只会显得我像一个技术菜鸟࿰…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...