C++的一些避免踩坑的技巧

news/2024/4/26 11:03:02/文章来源:https://blog.csdn.net/weixin_43340455/article/details/130347777

    C++是一种强大而复杂的编程语言,对于初学者来说,很容易踩到一些语法陷阱。在本篇博客中,我将介绍一些C++中常见的语法坑点,希望能够帮助读者更好地理解和掌握这门语言。

1. 整型除法会向零取整

    在C++中,两个整型数相除时,结果将会向零取整。例如,10/3的结果是3而不是4。这是因为整型除法会直接忽略余数,只保留商的整数部分。

    如果需要获得精确的浮点数结果,可以将其中一个操作数转换为浮点数类型。例如,可以使用以下代码来获得10/3的浮点数结果:

double a = 10;
double b = 3;
double c = a / b; // c的值为3.33333

2. 字符串的大小写敏感

    C++中的字符串是大小写敏感的,即“Hello”和“hello”被视为两个不同的字符串。在比较字符串时,需要使用字符串比较函数(例如strcmp)而不是等于号。

    另外,需要注意字符串的末尾有一个空字符'\0',在处理字符串时需要特别注意,否则可能会导致缓冲区溢出等问题。

3. 数组越界会导致不可预测的行为

    在C++中,数组越界会导致不可预测的行为,可能会破坏内存中的其他数据。因此,在使用数组时需要特别注意数组的下标范围。

    可以使用常量或枚举类型来定义数组的大小,以便在编译时检查越界错误。例如:

const int SIZE = 10;
int arr[SIZE];

4. 引用必须初始化

    在C++中,引用是一种指向变量的别名。引用必须在声明时进行初始化,否则会导致编译错误。例如:​​​​​​​

int a = 10;
int& ref = a; // 正确,ref是a的引用
int& ref2; // 错误,引用必须初始化

5. 隐式类型转换可能导致精度丢失

    C++中的隐式类型转换可能导致精度丢失,尤其是在进行浮点数运算时。在这种情况下,可以使用显式类型转换来获得更准确的结果。例如:​​​​​​​

double a = 3.14;
int b = static_cast<int>(a); // b的值为3

6. 指针操作需要注意空指针

    在C++中,指针是一种非常强大的数据类型,但是使用指针时需要特别注意空指针的情,否则可能会导致程序崩溃或未定义的行为。在对指针进行操作之前,需要检查指针是否为空。例如:​​​​​​​

int* ptr = nullptr;
if (ptr != nullptr) {
// 对ptr进行操作
}

7. switch语句中的break

    在C++的switch语句中,每个case语句必须以break语句结束,否则会导致控制流继续执行下一个case语句,直到遇到break或switch语句结束。如果没有任何一个case语句以break语句结束,则默认执行最后一个case语句。

    需要特别注意,如果没有任何一个case语句匹配,则不会执行任何一个case语句,也不会执行默认情况。因此,在switch语句中应该始终提供一个默认情况来处理这种情况。例如:

switch (n) {
case 1:
// 处理情况1
break;
case 2:
// 处理情况2
break;
default:
// 处理其他情况
break;
}

8. 函数参数传递

    在C++中,函数参数可以按值传递、按引用传递或按指针传递。按值传递会复制参数的值,按引用传递会直接使用参数的别名,按指针传递会使用指针指向的对象。需要注意,如果按值传递大型对象,会导致不必要的复制开销;如果按引用传递不可修改的参数,会导致不必要的错误;如果按指针传递空指针,会导致未定义的行为。

    在选择函数参数传递方式时,需要根据实际情况进行权衡。通常来说,对于大型对象,应该按引用或按指针传递;对于不可修改的参数,应该按常量引用传递;对于可能为空的指针,应该使用指针并进行空指针检查。

9. 多态性的实现

    在C++中,多态性可以通过虚函数和纯虚函数来实现。虚函数可以在派生类中被重写,从而实现运行时多态性;纯虚函数没有实现,必须在派生类中重写,从而实现接口和抽象类。

    需要注意,使用虚函数和纯虚函数时需要特别注意访问控制和构造函数和析构函数的执行顺序。特别是在多重继承的情况下,需要特别小心,以避免出现未定义的行为。

10. 内存管理

    在C++中,内存管理是非常重要的,必须手动分配和释放内存。如果不小心释放了已经释放的内存,会导致未定义的行为,如果不小心忘记释放内存,会导致内存泄漏,最终导致程序崩溃。

    为了避免这些问题,可以使用一些内存管理技术,如智能指针、RAII等。智能指针可以自动释放内存,并且可以跟踪多个指针对同一块内存的引用计数;RAII可以通过构造函数和析构函数来自动分配和释放资源。

11. 代码风格

    在C++中,代码风格也非常重要。一致的代码风格可以提高代码的可读性和可维护性,并且可以使代码更容易阅读和理解。可以使用一些代码风格指南来指导代码的编写,如Google的C++代码风格指南、Microsoft的C++代码风格指南等。

    需要注意,代码风格不仅包括缩进、命名、注释等基本要素,还包括函数长度、类的设计、头文件的管理等方面。在编写代码时,需要尽量遵守一致的代码风格,并且可以使用一些代码静态分析工具来检查代码风格的一致性和合规性。

结语

    C++是一种非常强大和灵活的编程语言,可以用于开发各种类型的应用程序,从桌面应用程序到嵌入式系统。然而,由于其语言特性的复杂性和灵活性,C++也是一种非常容易出错的语言。为了避免这些问题,需要仔细研究C++语言特性,并且使用一些好的编码实践和工具来支持代码开发和维护。希望这篇文章可以帮助你更好地理解C++语言和编程实践,并且能够在C++编程中取得更好的成果。

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

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

相关文章

算法训练 Day41 | 动态规划

343. 整数拆分 思路&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义&#xff1a;dp[i]&#xff1a;分拆数字i&#xff0c;可以得到的最大乘积为dp[i]。 确定递推公式&#xff1a;dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j)) 可以想 dp[i]最…

3.Spring Security实现JWT token验证

目录 1. Spring Security详细介绍 2. Spring Security详细使用 3. Spring Security实现JWT token验证 4. JWT&#xff08;JSON Web Token&#xff0c;JSON令牌&#xff09; 5. Spring Security安全注解 Spring Security实现JWT token验证 Spring Security是Spring提供的一…

【Spring篇】DI相关内容

&#x1f353;系列专栏:Spring系列专栏 &#x1f349;个人主页:个人主页 目录 一、setter注入 1.环境准备 2.注入引用数据类型 3.注入简单数据类型 二、构造器注入 1.环境准备 2.构造器注入引用数据类型 3.构造器注入多个引用数据类型 4.构造器注入多个简单数据类型 …

SAS学习第4章:t检验

前话&#xff1a;分析试验数据的差异&#xff0c;一般都会假设样本值之间或者样本与标准值之间无差异&#xff0c;根据不同方法计算得出的t值、q值、F值等等&#xff0c;均表示两者之间的差异程度&#xff0c;值越大&#xff0c;两者差异越大&#xff0c;该假设越不成立&#x…

Vue3+Three.js+antvG2实战项目 智慧城市(三)

前言 在网上找了很久都没有找到使用Three.js开发智慧城市的免费文章或者免费视频,自己花了一点时间做了一个纯前端的智慧城市项目。 技术栈都是最新的:vue3vitetypeScriptThreeantv G2 源码分享 源码 模型,天空图盒子链接分享(不想下载源码可以只用下这个)提取码1234 20230424_…

TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

https://www.usenix.org/conference/osdi18/presentation/chen 文章目录 TVM: An Automated End-to-End Optimizing Compiler for Deep Learning引言1. 简介2. 总览3. 优化计算图4. 生成张量运算4.1 张量表达式和调度空间4.3 嵌套并行与协作4.3 张量化4.4 显式内存延迟隐藏 5 .…

跌倒检测和识别4:C++实现跌倒检测(含源码,可实时跌倒检测)

跌倒检测和识别4&#xff1a;C实现跌倒检测(含源码&#xff0c;可实时跌倒检测) 目录 跌倒检测和识别4&#xff1a;C实现跌倒检测(含源码&#xff0c;可实时跌倒检测) 1. 前言 2. 跌倒检测模型&#xff08;YOLOv5&#xff09; &#xff08;1&#xff09;跌倒检测模型训练 …

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

4月22日&#xff0c;2023首届云数据库技术沙龙 MySQL x ClickHouse 专场&#xff0c;在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化&#xff0c;让数据更智能”为主题&#xff0c;汇聚字节跳动、阿里云、玖章算术、华为云、腾…

【大数据之Hadoop】十九、MapReduce总结

MapTask工作机制 &#xff08;1&#xff09;Read阶段&#xff1a; job的提交流程&#xff1a;待读写的源数据由客户端进行切片划分&#xff0c;划分完成之后提交(切片信息、jar包、xml配置文件)给yarn&#xff0c;yarn开启MrAppMaster&#xff0c;MrAppMaster读取切片信息&…

10.java程序员必知必会类库之邮件

前言 邮件功能在当前互联网应用中已经是很成熟的功能&#xff0c;也是作为java程序员应该掌握的技能。常见使用场景有&#xff1a; 电商软件开电子发票&#xff0c;需要发到用户邮箱里面生产实时报警&#xff0c;需要发到邮箱里面银行软件申请的征信报告&#xff0c;电子账单…

《C++ Primer Plus》(第6版)第17章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第17章编程练习 《C Primer Plus》&#xff08;第6版&#xff09;第17章编程练习1. 计算输入流中第一个\$之前的字符数目2. 将键盘输入&#xff08;直到模拟的文件尾&#xff09;复制到通过命令行指定的文件中3. 将一个文件复制…

【难学易用c++ 之 继承】

目录&#xff1a; 前言一、继承的概念及定义&#xff08;一&#xff09;概念&#xff08;二&#xff09;继承定义继承关系和访问限定符继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七…

如何使用阿里云短信服务实现登录页面,手机验证码登录?

1&#xff1a;个人如何使用阿里云短信服务&#xff1f; 2022如何使用个人阿里云短信服务&#xff1f;_linxiMY的博客-CSDN博客添加完成之后&#xff0c;等待审核&#xff01;一般2个小时就会出来审核结果了&#xff0c;这里我因为注册申请时填写规则有误&#xff0c;足足审核了…

pytest 学习三(前置后置操作)

pytest测试框架_pytest框架-CSDN博客 一、常用的操作 一、setup/teardown 每个用例之前、之后执行 二、setup_class/teardown_class 在每个类之前、之后执行一次 二、pytest.fixture 设置前置后置操作范围 pytest.fixture(scope"",params,autouse,ids,name) 其中 sc…

JavaScript模块化开发

目录&#xff1a; 1 认识模块化开发 2 CommonJS和Node 3 require函数解析 4 AMD和CMD&#xff08;了解&#xff09; 5 ESModule用法详解 6 ESModule运行原理 模块化不是两个不同的js文件直接导入到某个页面中的&#xff0c;因为这两个文件只要有相同的变量或函数&#xf…

R基础函数概览(一)

rep 函数形式&#xff1a;rep(x, time , length , each ,) 参数说明&#xff1a; x&#xff1a;代表的是你要进行复制的对象&#xff0c;可以是一个向量或者是一个因子。 times&#xff1a;代表的是复制的次数&#xff0c;只能为正数。负数以及NA值都会为错误值。复制是指的…

云原生(docker+k8s+阿里云)-Docker

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 从Docker到Kubernetes进阶-社区 云计算学习路线-阿里云大学 如上图&#xff0c;服务器有公网ip和私网ip&#xff0c;公网ip是外部访问…

Ubuntu20.04使用多卡训练HyperNetwork模型和LoRA模型全流程及疑难问题解决方案

目录 一. LoRA模型多卡训练1.1 安装xformer等库1.2 设置路径1.3 多卡训练 二. LoRA模型多卡训练疑难报错解决方案多卡训练报错 软硬件配置&#xff1a; CPU: AMD 5800 8core 16Thread GPU: NVIDIA RTX 3090 *1 NVIDIA TITAN RTX *1 OS: Ubuntu20.04 一. LoRA模型多卡训练 1.1 …

一篇终结synchronized

一&#xff1a;基本原理 Java对象在内存中由两部分组成 &#xff1a; 1 是成员变量 2 是对象头&#xff0c;以32位虚拟机介绍&#xff1a;此时对象头是64位&#xff0c;即8字节 其中32个字节代表 mark word 另外32个字节代表klass word分别是什么意思呢&#xff1f; 1 klass …

写题总结1

先把自己写完的总结一下&#xff1a; 题目一&#xff1a; 猫儿园的告示牌上贴着 ab 大小的矩形广告纸。猫猫对广告不感兴趣&#xff0c;她想知道能否用 cd 的矩形白纸完全覆盖这个广告。猫猫可以对白纸进行平移、旋转&#xff0c;但不能折叠或撕开等。如果可以完全覆盖输出 YE…