Cat类compareweight函数是否需用指针参数,能否改用栈对象?
关于C++ Cat类compareweight函数参数的疑问
首先先把你给出的原始代码贴出来方便参考:
class Cat{ private: float weight; int age; public: float getweight(); bool compareweight(Cat*); }; Cat::getweight(){ return weight; } bool Cat::compareweight(Cat* other){ return weight > other->weight; }
当然不是必须用指针作为参数啦!完全可以改用值传递(栈对象)的方式,不过咱们得把这里的门道说清楚:
1. 能不能改用值传递?
绝对可以!你只需要修改函数的声明和实现:
- 把声明改成
bool compareweight(Cat other); - 实现里直接访问参数对象的
weight成员就行——别担心private权限的问题,C++规则里,同一个类的成员函数可以访问同类型任意对象的private成员,所以完全合法。
修改后的代码示例:
class Cat{ private: float weight; int age; public: float getweight(); bool compareweight(Cat other); // 值传递参数 }; Cat::getweight(){ return weight; } bool Cat::compareweight(Cat other){ return weight > other.weight; // 直接访问同类型对象的private成员 }
2. 两种参数方式的对比
虽然两种方式都能实现功能,但各有优劣:
- 指针传递:
- 优点:不需要拷贝Cat对象,性能开销小,适合大型对象或者频繁调用的场景;
- 缺点:必须保证传入的指针不是
nullptr,否则会触发未定义行为(程序崩溃或者奇怪的错误),调用时还要注意指针的生命周期。
- 值传递:
- 优点:调用更简单,直接传栈对象或者临时对象就行,完全不用担心空指针问题,安全性更高;
- 缺点:每次调用都会创建一个Cat对象的拷贝,如果类里有大量成员或者拷贝构造函数开销大,会影响性能。
3. 更推荐的写法:const引用传递
其实在实际开发中,我们更常用const引用来传递这类参数,也就是bool compareweight(const Cat& other);。它结合了两种方式的优点:
- 不会拷贝对象,性能和指针传递一样好;
- 不需要担心空指针,调用方式和值传递一样简单;
const关键字保证了我们不会意外修改传入的对象,代码更健壮。
对应的实现代码:
bool Cat::compareweight(const Cat& other){ return weight > other.weight; }
内容的提问来源于stack exchange,提问作者Basil Hallaq
相关产品推荐
相关产品推荐

