是否必须通过c ++中的引用传递类

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引用?

据我所知,我的解决方案既复制weightvalue堆栈,而不是仅复制指向对象,而是在栈上+4个字节(在32位系统的情况下)真的是太大的问题,还是我失去了一些东西更严重(如某种内存泄漏)?

我还检查了两种解决方案的反汇编,但我找不到任何可以使我的解决方案值得零点的东西.

我也问过我的教授,但他们开始谈论传递它,const但我不知道如何使这个解决方案在工作方面更好/不起作用.另一位教授告诉我"这在语法上是完全错误的".但它使用Visual Studio和MinGW编译,所以我也无法理解.

另请注意,这是电气工程师的课程.

Rya*_*ing 5

是否必须通过c ++中的引用传递类

没有.

"将它作为常量传递",这只是愚蠢的,如果你通过值传递,那么如果将参数标记为const,则对外界来说并不重要.

要尽可能直接回答您的问题,按值继承其他类是没有错的.当对象较小时,最好通过值传递.在您的情况下,在典型的64位平台上,大小差异为0(每个int 2*4bytes vs一个8字节指针).所以你的" 堆栈上的+4个字节 "实际上并不存在,它的大小相同

我预测优化编译器会重写您的代码以获取Crateby值,即使您将其声明为通过引用获取.这将是出于空间局部性和易于访问的原因.如果指针被传递,则需要按照指针访问数据成员,这会添加一个步骤.

你的教授错误地给你0分,除非在课程中有一些要求非常明确,所有操作员都必须参考参考.在const CrateVS Crate的问题并不重要.