19g*_*g96 4 c++ operator-overloading pass-by-reference
我在c ++中有一个中期,我们的一个任务是编写一个类,它重载了<<运算符,以便我们可以打印该类的私有字段std::ostream,如下所示:
Crate c1(2600, 9500);
Crate c2;
cout << c1 << ", " << c2 << endl;
Run Code Online (Sandbox Code Playgroud)
不得不打印 Crate weight: 2600 Crate value: 9500, Crate weight: 0 Crate value: 0
我的实现是
class Crate {
int weight;
int value;
public:
Crate ():weight(0), value(0) {}
Crate (int w, int v);
Crate& operator+= (Crate& c);
int operator+= (int& w);
friend ostream& operator<< (ostream& out, Crate c) {
out << "Crate weight: " << c.weight;
out << " Crate value: " << c.value;
return out;
}
};
Run Code Online (Sandbox Code Playgroud)
但是,我为重载<<运算符得到了0/3分,我的解决方案和评估模板之间的唯一区别是我通过Crate c值传递它们并通过引用传递它.
当然,如果该类将动态分配成员变量,我将不得不通过引用传递它的实例,但这不是这里的情况.
我知道cppreference.com上提供的示例使用了const引用,但有没有严格的规则,在执行此操作时必须使用const引用?
据我所知,我的解决方案既复制weight和value堆栈,而不是仅复制指向对象,而是在栈上+4个字节(在32位系统的情况下)真的是太大的问题,还是我失去了一些东西更严重(如某种内存泄漏)?
我还检查了两种解决方案的反汇编,但我找不到任何可以使我的解决方案值得零点的东西.
我也问过我的教授,但他们开始谈论传递它,const但我不知道如何使这个解决方案在工作方面更好/不起作用.另一位教授告诉我"这在语法上是完全错误的".但它使用Visual Studio和MinGW编译,所以我也无法理解.
另请注意,这是电气工程师的课程.
是否必须通过c ++中的引用传递类
没有.
"将它作为常量传递",这只是愚蠢的,如果你通过值传递,那么如果将参数标记为const,则对外界来说并不重要.
要尽可能直接回答您的问题,按值继承其他类是没有错的.当对象较小时,最好通过值传递.在您的情况下,在典型的64位平台上,大小差异为0(每个int 2*4bytes vs一个8字节指针).所以你的" 堆栈上的+4个字节 "实际上并不存在,它的大小相同
我预测优化编译器会重写您的代码以获取Crateby值,即使您将其声明为通过引用获取.这将是出于空间局部性和易于访问的原因.如果指针被传递,则需要按照指针访问数据成员,这会添加一个步骤.
你的教授错误地给你0分,除非在课程中有一些要求非常明确,所有操作员都必须参考参考.在const CrateVS Crate的问题并不重要.