【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;
}

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

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

相关文章

nginx的底层理解

Nginx是一个高性能的Web服务器&#xff0c;同时也是一个反向代理服务器、负载均衡器和HTTP缓存器。它的底层设计注重效率和性能&#xff0c;能够支持高并发连接数&#xff0c;最大可以支持约50000个并发连接。以下是Nginx的一些关键特性和底层理解&#xff1a; 事件驱动模型&a…

机器人十大前沿技术(2023-2024年)

2023-2024年机器人十大前沿技术 1. 具身智能与垂直大模型 具身智能是指拥有自主感知、交互和行动能力的智能体&#xff0c;能够与环境进行实时互动&#xff0c;从而实现对环境的理解和适应。 “大模型”是指在深度学习和人工智能领域中&#xff0c;使用大量参数和数据进行训…

【PHP】web服务器支持PHP_环境配置

一、PHP运行目前为止主要有4方式 &#xff08;1&#xff09;以模块加载的方式运行&#xff0c;初学者可能不容易理解&#xff0c;其实就是将PHP集成到Apache服务器&#xff0c; 以同一个进程运行。 &#xff08;2&#xff09;以CGI的方式运行&#xff0c;CGI英文叫…

HarmonyOS4.0系列——08、整合UI常用组件

HarmonyOS4.0 系列——08、UI 组件 Blank Blank 组件在横竖屏占满空余空间效果 // xxx.ets Entry Component struct BlankExample {build() {Column() {Row() {Text(Button).fontSize(18)Blank()Toggle({type: ToggleType.Switch}).margin({top: 14,bottom: 14,left: 6,righ…

go-redis 使用 redis 6.0.14 版本错误: consider implementing encoding.BinaryMarshaler

使用方法 err : bp.data.redis.Get(ctx, policyKey).Scan(&result)起初在 redis 5.x.x 版本并没有遇到错误&#xff0c;但是在切换 redis 实例之后就出现了错误&#xff08;他们之间只是版本不同&#xff09;。 修复方法 看错误日志的描述&#xff0c;大概含义就是需要我们…

【Spring Boot 3】【JPA】一对一双向关联

【Spring Boot 3】【JPA】一对一双向关联 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…

Windows 使设置更改立即生效——并行发送广播消息

目录 前言 1 遍历窗口句柄列表 2 使用 SendMessageTimeout 发送延时消息 3 并行发送消息实现模拟广播消息 4 修改 UIPI 消息过滤器设置 5 托盘图标刷新的处理 6 完整代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_5907…

effective c++ 笔记 条款18-25

条款18&#xff1a;让接口容易被正确使用&#xff0c;不易误使用 使用外覆类型&#xff08;wrapper&#xff09;提醒调用者传参错误检查&#xff0c;将参数的附加条件限制在类型本身 Data::Data(int month, int day, int year) { ... }三个参数类型相同的函数容易造成误用 Da…

全球首个AI管理体系标准:ISO/IEC 42001《信息技术–人工智能–管理系统》

ISO/IEC 42001《信息技术–人工智能–管理系统》是全球首个针对人工智能&#xff08;AI&#xff09;管理体系的国际标准。该标准旨在帮助组织在开发、实施和维护AI技术时建立有效的管理体系&#xff0c;以确保AI系统的可靠性、安全性和合规性。 ISO/IEC 42001标准涵盖了多个方…

Java学习24--异常

异常 软件运行过程中的各种意料之外叫做Exception&#xff0c;比如要读取的文件找不到&#xff0c;准备联网发现没网&#xff0c;等着int参数来了个String 注意Error和exception不一样&#xff0c;error错的比较猛&#xff0c;一般是直接把JAVA整个搞崩了&#xff0c;比如内存…

洛谷C++简单题小练习day15—计算阶乘小程序(不用循环)

day15--计算阶乘小程序--2.19 习题概述 题目描述 求 n!&#xff0c;也就是 123⋯n。 挑战&#xff1a;尝试不使用循环语句&#xff08;for、while&#xff09;完成这个任务。 输入格式 第一行输入一个正整数 n。 输出格式 输出一个正整数&#xff0c;表示 n! 代码部分 …

瑞芯微RK3588驱动配置之DVP摄像头1

发现很多人不会RK3588DVP摄像头的驱动配置&#xff0c;这里简单分享一下&#xff0c;各位老铁点个赞&#xff0c;一键三连&#xff0c;给点动力。 这篇主要讲一下DTS设备树的配置&#xff0c;下篇写具体的驱动设计。 因为瑞芯微的大部分芯片都支持DVP摄像头&#xff0c;配置都大…

Android内存分析

1.分析某个进程的内存情况 1.1 生成.hprof文件 可以在运行的设备上&#xff0c;使用adb命令生成 .hprof文件&#xff0c;表示在执行命令的那一刻&#xff0c;该进程的内存情况。如下&#xff1a; am dumpheap com.example.demo /data/local/tmp/demo.hprof这里就是对包名为c…

【力扣白嫖日记】1890.2020年最后一次登录

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1890.2020年最后一次登录 表&#xff1a;Logins 列名类型user_idinttime_stampvarchar (user_id, time_sta…

Unity UGUI的DrawCall优化

Unity UGUI是一种强大的用户界面设计工具&#xff0c;它可以帮助开发者快速创建各种界面元素&#xff0c;从按钮和文本到滑块和面板等。然而&#xff0c;在使用UGUI时&#xff0c;一个常见的性能瓶颈就是DrawCall过多导致的性能下降。在本文中&#xff0c;我们将深入探讨UGUI的…

搜索算法(算法竞赛、蓝桥杯)--BFS八数码难题、抓住那头牛、魔板问题

1、B站视频链接&#xff1a;B14 BFS 八数码难题_哔哩哔哩_bilibili 题目链接&#xff1a;八数码难题 - 洛谷 #include <bits/stdc.h> using namespace std; char c; string str; unordered_map<string,int> d;//记录步数 queue<string> q; int dx[4]{-1,0,1…

微服务—RabbitMQ高级(业务在各方面的可靠性)

本博客为个人学习笔记&#xff0c;学习网站&#xff1a;2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 生产者可靠性 生产者重连机制 生产者确认机制 介绍 实现 总结与建议 MQ可靠性 数据持久化 LazyQueue 消费者可靠性 消费者确认机制 失败重试机制 失…

nginx 安装

Nginx 简介 nginx一种十分轻量级的http服务器一种高性能的HTTP和反向代理服务器,同时是一个IMAP/POP3/SMTP 代理服务器其中官网网站 安装Nginx 使用源码编辑安装 #提前安装相关工具软件包 yum -y install net-tools tar unzip gcc make pcre-devel openssl-devel httpd-too…

深度学习之pytorch实现逻辑斯蒂回归

深度学习之pytorch实现逻辑斯蒂回归 解决的问题数学公式logiatic函数损失值 代码与线性回归代码的区别数据损失值构造回归的函数 结果分析 解决的问题 logistic 适用于分类问题&#xff0c;这里案例( y为0和1 &#xff0c;0和 1 分别代表一类&#xff09; 于解决二分类&#xf…

2024上海国际地下空间工程与技术展览会

2024上海国际地下空间工程与技术展览会 Underground Space Project and Technology Exhibition 2024 2024年10月31日-11月2日 上海世博展览馆 国展路1099号 展会规模&#xff1a;25000平方米 主办单位&#xff1a;联合国人居署 上海市住房与城乡建设管理委员会 一、城博会…