C++细节之二---注意函数的返回值

c++中complex类的实现 #ifndef __MYCOMPLEX__ #define __MYCOMPLEX__ class complex; complex& __doapl (complex* ths, const complex& r); complex& __doami (complex* ths, const complex& r); complex& __doaml (complex* ths, const complex& r); 相同类的各个实例对象 阅读详情

  似乎从来没有犯过返回值还出问题的错误,一般来说,一个函数结束后,会在函数指针出开辟一块内存存放返回值,这也是函数生命周期结束返回值以来存在的原因。没有犯过这种错误是因为,我们很少写返回const XXX &,也就是当返回值是一个大对象的引用的时候,我们经常容易犯这种错误。

    和参数传递一样,函数的返回也包含3种,按值返回,按常量的引用返回,按地址返回。其中按地址返回就是返回一个指针了。按值返回当然是最安全的。但是按常理的引用返回问题可能很多,这里我们应该多加注意。

  如果返回的对象是类类型的,我们最好的选择当然是返回常量的引用以节省复制对象所带来的开销。但是有一个前提:必须是返回的引用在我们返回之前是不是已经销毁了?如果销毁了,那我们将返回错误。但是也有可能正确,就看释放引用到这个对象的的销毁速度,如果销毁速度慢,有可能可以返回正确,但这已经说明,会带来不可预期的错误。

  以下是2段代码,第一段时正确的,第二段是错误的。

const string & findMax(const vector<string> & arr) {    int maxIndex=0;    for(int i=1;i<arr.size();i++)    {       if(arr[maxIndex]<arr[i])       {          maxIndex=i;       }    }    return arr[maxIndex]; }

const string & findMaxWrong(const vector<string> & arr) {    string maxValue=arr[0];    for(int i=1;i<arr.size();i++)    {       if(maxValue<arr[i])       {          maxIndex=arr[i];       }    }    return maxValue; }

  分析原因:第一个之所以正确,使因为返回的arr,在函数的外部,当然,在函数结束的时候它还存在。

  第二个之所以错误,是因为maxValue是一个局部变量,当函数返回的时候就不复存在了。如果编译器没有查出这个问题,那么也有可能能返回成功,就看maxValue的析构速度了。

 

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】 本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。 阅读详情

相关推荐

椭圆曲线点加的推导公式(一)

椭圆曲线点加推导过程

qq_32100199的博客 1515

引用做函数返回值的注意事项(C++)

1、不要返回局部变量的引用 #include <iostream> using namespace std; //返回值类型“ int & ”即返回的是一个int类型的变量的别名 int& test() { int a=10;//a为局部变量,存放在四区中的栈区 return a; } int main() { //返回a的别名存放在变量ref中 int &ref=test(); //输出ref cout <&lt

Ivan_47的博客 831

今天出一个candence 17.4 allego的安装教程

7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。

hcvinh的博客 2725

C++中返回值为数组的函数及其应用

通常C++程序里的函数返回值只能是 int,double 等数值型,如果希望返回值是一个数组该怎么做呢?   一个办法就是定义数组的类,如 k 维数组的类: class array { public: int a[k]; }; 将函数的返回值返回到 array 的对象。   另一个办法是用指针来实现,即将函数返回到一个指针,而指针指向一个数组。例如: int *mod(int ...

vegetable__chicken的博客 1万+

virtualbox虚拟机里面最顶部没有控制、设置和帮助等选项

无意中操作,导致virtualbox虚拟机里面最顶部没有控制,设置和帮助选项  virtualbox虚拟机窗口显示如下如: 如何设置,窗口显示如下图所示呢: virtualbox虚拟机窗口模式显示设置,切换可以通过如下图所示操作进行切换: PS:一定要是右边的Ctrl+C

WEL测试 8778

【全网最全最详细】智能体提示词prompt教程

定义:提示词是用户输入给AI模型(如ChatGPT、MidJourney等)的指令或问题,用于引导模型生成特定类型的输出。它是用户与AI交互的核心媒介。作用:提示词的质量直接影响AI输出的准确性和相关性。好的提示词能明确任务边界、减少歧义,并激发模型的创造力。提示词就是“给AI下指令的说明书”——越清楚、越具体,AI干得越好!帮你更快、更准地拿到想要的结果,不用和AI“猜谜语”。

qq_38196449的博客 8214

C++小细节3-函数

数组名的特殊性,数组作为形参,长度需要的必要性;函数指针的声明和使用

weixin_44200074的博客 170

基于Autoware制作高精地图(一)

基于Autoware制作高精地图(一) ​开始进入正题,也是最近在忙的一件事,制作高精地图。 高精地图的制作大概分为以下四个流程(不一定完全正确): 1.构建点云地图; 2.点云地图标注; 3.制作OpenDrive地图; 4.地图存储索引。 这篇文章主要讲解如何构建点云地图。 首先我们要有一段自己录制的激光雷达点云数据,这里推荐大家采用Velodyne16线激光雷达,因为这里我们构建的点云底图是三维的,而采用Velodyne而不是速腾聚创(rslidar)等其他品牌的原因是Autoware里面有一个选项是

weixin_44570248的博客 7797

C++系列:函数返回值注意事项

编译器可能能检测出这个错误,也可能检测不出来,要看编译器的实现,好在大部分情况编译器甚至IDE可以帮我们检测出来,但是如果不幸我们用了检测不出来的编译器,可能会在运行时发生未定义行为错误。文本介绍了函数返回值的各种小细节:值是如何被返回,返回类类型怎么使用,返回左值引用,返回列表以及返回数组指针等。当函数返回的是类类型,因为它的返回值可以继续参与运算,所以使用调用运算符可以继续调用函数返回结果对象的成员。如果函数返回的是引用,因为引用只是它所引对象的别名,则不会将所引用的值拷贝到调用点。

az44yao的专栏 207

0.嵌入式控制器EC实战 Embedded Controller开发概述

文章目录前言1.嵌入式控制器EC概述2.EC芯片框图(IT8502为例)3.General Purpose I/O Port (GPIO)4.SMBus(System Management Bus,系统管理总线)5.PWM、TACH6.KBC(KeyBoard Controller)7.PS/28.ADC(模数转换)总结 前言 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 1.嵌入式控制器EC概述 嵌入式控制器EC是挂在CPU的L

qq_30135687的博客 1万+

⭐️VMwareWorkstation17.0虚拟机搭建WindowsXP虚拟机(完整安装步骤详细图文教程)

Windows XP是微软公司研发的计算机操作系统,于2001年10月25日正式发布。其名字中“XP”的意思来自英文中的“体验”(Experience)。Windows XP使用了Luna图形用户界面和双列开始菜单,提升了系统的安全性和工作性能,提供了WiFi支持,简化了软件的安装和运行,并增加了远程桌面功能。

Python老吕的博客 1万+

C++引用做函数返回值存在的问题

C++中有了引用的概念,它可以作为函数的返回值,其实这里有一个问题各位道友,我们先来看这样一组代码大家可以猜一猜,打印出来是什么?1+2=3?实际上是结果变成了7这其实是引用作为函数返回值时的一个隐患那么为什么会造成这种结果呢这是Add(1,2)的运行当Add函数结束运行后,其对应的栈空间被收回,main函数中ret引用的实际上时一块已经被释放的空间。

emt11111的博客 212

TC3XX - MCAL知识点(九):PWM EB-tresos配置说明及代码浅析

脉冲宽度调制(PWM)驱动器负责提供与AUTOSAR指定的PWM信号生成相关的标准服务。PWM通道的底层定时器驱动是GTM (TOM或ATOM片)或CCU6 (T12或T13片)定时器通道。软硬件匹配关系如下:PWM直接引用的是GTM与CCU6模块,然后GTM与CCU6再关联到Port的,根据软硬件匹配关系,也能调用中断来使用,本例子没使用中断。CCU6是一个高分辨率的16位捕获和比较单元,具有特定的应用模式,主要用于交流驱动控制。特殊的工作模式支持控制无刷直流电机使用霍尔传感器或反电动势检测。

梦想技术家 2884

c/c++基础知识(引用传参,引用返回值,内联函数,以及一些细节等等)

,这个tmp是一个临时变量,是会开辟空间以及发生拷贝的(只是在函数执行完毕,这块空间会自动释放,重置数值),并且这个临时变量具有常性,是不能用来初始化非常量引用的,所以后面的int& b = count1()会报错,如果我们在“int& b = count1()”前加上const则不会报错,常量初始化常量引用非常合理。总的来说传值和传引用的本质区别就是,传引用不开辟新的空间,不会发生数据的拷贝,从而减少时间和空间的浪费,不过要注意函数返回时传引用所用变量的声明周期,一不小心就会造成随机值。

m0_61832025的博客 790

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

使用CPP刷算法题几个需要注意的点

使用CPP刷算法题几个需要注意的点 ​ 靠发博客的成就感督促自己学习…… STL中的pop函数只能删除元素,没有返回值 ​ 举个例子,获取vector中的最后一个元素,并删除它。 int res = nums.back(); nums.pop_back(); cpp在string的末尾添加字母 ​ 我所知道的是两种 string s; s = "abc"; s.push_back('s'); //method1 只能插入单个字符 void push_back(char c);

qq_43561370的博客 278

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

memcpy()函数用法

转载自http://blog.csdn.net/tigerjibo/article/details/6841531 函数原型 void *memcpy(void*dest, const void *src, size_t n); 功能 由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。 头文件 #i

hqh45的专栏 1442

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++11新特性:关键字

1、auto关键字 auto是C++11新增的自动变量,其原理是编译器根据上下文情况,确定组通变量的真正类型,并不是弱类型语言中的弱化变量。在真正的编程中建议尽量少使用auto,直接写出变量类型更加清晰易懂,在不知道变量类型或者冗长复杂的类型中可以考虑使用。 1.1 用于常用类型推导 int main() { auto var = 10; auto str = "hello...

草根工厂——技术虐我千百遍,我依然待你如初恋 811

C++中的lambda函数详解

本文主要讲解C++中的lambda函数的使用方法与注意事项。

A11en3的博客 542

《Effective Modern C++》学习笔记 - Item 3: 理解decltype

アルタイル 718

c++ g++一些区别

1、输出double类型时,如果采用G++提交,scanf采用%lf , prinf采用%f,否则会报错【WA】。2、使用GCC/G++的提醒:对于64位整数, long long int 和 __int64 都是支持并且等价的。但是在读和写的时候只支持scanf(“%I64d”, …)和printf(“%I64d”, …),不支持”%lld”,是因为MinGW下的GCC和G++使用的msvcrt.

skymeteorite 506

c++入门

(1).函数中在堆上的或者是静态的空间返回引用没有问题,因为栈帧的销毁不会销毁空间。(2).函数中在栈上开辟的空间返回引用值则有问题,原由与上述相反。

yonlylove的博客 410

C++基础知识易错点总结

目录不能被重载的运算符神奇的变量名y1main()函数的返回值循环语句问题重载运算符 不能被重载的运算符 在C++中,不能被重载的运算符有: . 成员运算符 .* 成员指针运算符 :: 作用域运算符 ?: 条件运算符 神奇的变量名y1 显示变量 y1 和 C++ 标准库中的某个变量名称冲突,这个问题应当引起注意。这不是头文件写成 <bits/stdc++.h> 引起的,即使换成各具体的头文件(< iostream >, < algorithm >, < ctri

Face_the_Blast的博客 506

【C++11】新特性——auto的使用

参考:http://blog.csdn.net/huang_xw/article/details/8760403 使用auto可以进行自动类型推断,或者作为函数的返回值。 需要注意的是,用auto声明的变量必须初始化; 函数和模板的参数不能声明为auto; auto会退化成指向数组的指针,除非被声明为数组的引用。 转载于:https://www.cnb...

weixin_30482181的博客 143

高质量编程之函数

函数是C++/C程序的基本功能单元,其重要性不言而喻。函数设计的细微缺点很容易导致该函数被错用,所以光使函数的功能正确是不够的。本章重点论述函数的接口设计和内部实现的一些规则。 函数接口的两个要素是参数和返回值。C语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递(pass by referen

aufeju的专栏 817

c++实现一个日期类

要求:可以计算一个日期+天数之后的日期判断日期的大小日期++,++日期(前置++,后置++)使用cout输出一个日期暂时那么多,后续有再行补充。

weixin_46342559的博客 364

int和unsigned int比较大小,vector的size()函数使用注意事项

int和unsigned int比较大小,vector的size()函数使用注意事项 首先我们需要知道int与unsigned int进行比较时,会先将int转换为unsigned int进行比较,二者都是正数时没有问题,但是,当int的值为负数时,就会出现-1 > 1的情况,所以使用时要注意,最好是不用。 重点来了,vector 的size()函数返回的就是unsigned int。 eg1: vector<int> nums; for(i = -1;i < nums.

qingtu11的博客 3270
上一篇: C++细节之一----3种参数传递方式的使用场景
下一篇: C++细节之三----当类中含有指针成员时
burningcpu
博客等级 码龄20年 13粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值