如何检查成员函数是否返回临时对象/数组对象及类对象数组存在性
1. 如何检查成员函数是否返回临时对象或数组对象?
其实从函数的签名和实现就能轻松判断,我给你拆解清楚:
判断是否返回临时对象:
如果函数的返回类型是非引用的值类型(比如int、std::string,或是你自定义的Classobject),那它返回的肯定是临时对象——因为值返回会在函数结束时创建一个对象副本,这个副本就是临时的,调用结束后会被自动销毁。举个例子:Classobject createNewItem() { return Classobject{}; } // 返回的是默认构造的临时对象要是返回的是左值引用(
Classobject&)或者右值引用(Classobject&&),那返回的就不是临时对象(除非你特意返回临时对象的引用,这一般是错误操作,别这么干)。判断是否返回数组对象:
先明确一个点:C++里函数不能直接返回原始数组(比如int[3]这种类型)。如果看到函数和数组相关的返回值,一般是这几种情况:- 返回
std::array<T, N>:这是值类型返回,返回的是临时的std::array对象,和普通值返回的逻辑一样,没问题。 - 返回
T*/const T*:这时候要警惕,如果指针指向的是函数内部的局部数组,那这个数组是临时的——函数结束后局部数组就被销毁了,返回的指针会变成野指针,非常危险。比如:int* badExample() { int nums[] = {1,2,3}; return nums; } // 局部数组是临时的,返回的指针无效 - 返回
std::vector<T>:这也是值返回,返回的是临时的容器对象,容器内部的数组由它自己管理,不用担心生命周期问题。
- 返回
2. 优化检查对象是否存在的函数
你的现有逻辑方向是对的,但有几个可以优化的地方,我帮你调整得更贴合需求:
首先,函数参数Classobject object是传值的,每次调用都会拷贝一个对象,没必要的开销不小,改成const Classobject& object(常量引用)就能避免这部分拷贝。
然后看你的需求:找到匹配对象就返回它,没找到就返回类的新实例。你现有代码里return Classobject{};是返回默认构造的新实例,完全符合需求;如果后续需要用传入对象的信息来构造新实例,也可以改成return object;——这个看你具体场景来选。
优化后的代码如下:
Classobject stock::checkIfItemExists(const Classobject& object) { // 遍历数组,通过uniqueIDString比较唯一性 for(int i = 0; i < stock.getSize(); i++) { if(compareUniqueIDs(object, stock[i])) { // 找到匹配项,返回它的副本(值返回会自动拷贝) return stock[i]; } } // 未找到,返回默认构造的新实例 return Classobject{}; }
另外,要是你想避免返回副本的开销,也可以考虑返回指针或者引用:比如返回const Classobject*,找到就返回&stock[i],没找到就返回new Classobject{}(记得要手动管理内存);或者用C++17及以上支持的std::optional<Classobject&>,这样能更安全地处理“不存在”的情况——不过这都得看你的项目环境和实际需求来决定。
内容的提问来源于stack exchange,提问作者martin

