【发布时间】:2016-07-21 16:16:49
【问题描述】:
我有一个 c++ 期中考试,我们的一项任务是编写一个类,它重载 << 运算符,以便我们可以将该类的私有字段打印到 std::ostream,如下所示:
Crate c1(2600, 9500);
Crate c2;
cout << c1 << ", " << c2 << endl;
必须打印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;
}
};
但是,我为重载的 << 运算符获得了 0/3 分,我的解决方案和评估模板之间的唯一区别是我通过值传递 Crate c,而他们通过引用传递它。
当然,如果类有动态分配的成员变量,我将不得不通过引用传递它的实例,但这里不是这样。
我知道cppreference.com 提供的示例使用了 const 引用,但有没有严格的规定在执行此操作时必须使用 const 引用?
我了解我的解决方案将weight 和value 都复制到堆栈中,而不是仅复制指向对象的指针,但是堆栈上的+4 字节(如果是32 位系统)确实那么多是一个问题,还是我错过了更严重的事情(比如某种内存泄漏)?
我还检查了这两个解决方案的反汇编,但我找不到任何可以使我的解决方案价值零分的东西。
我也问过我的教授,但他们开始谈论将其作为const 传递,但我不明白这会如何使这个解决方案在工作方面更好/不起作用。另一位教授告诉我“这在语法上完全不正确”。但是它是用 Visual Studio 和 MinGW 编译的,所以我也无法理解。
另请注意,这是一门面向电气工程师的课程。
【问题讨论】:
-
我不知道我是否同意它的价值为 0,但我一直听到的经验法则是,如果类型大于它的指针(基本上是任何非原始类型),则通过通过引用,除非您绝对需要修改它,否则它应该始终为 const。
-
@Carcigenicate
struct Cls { int i; };=>sizeof(Cls) < sizeof(Cls*)在典型的 64 位平台上 -
我知道运算符重载需要迭代参数为 const。但是,这些类型的技术细节超出了我的知识范围。这是一个可能有帮助的解释:stackoverflow.com/a/2828320/4775223
-
@RyanHaining 好吧,很明显,如果你的类只有一个原始字段,它会非常小。说“基本上任何非原始的”对我来说有点宽泛。
-
顺便说一句,格雷格,保持这种态度,你可能会成为一个非常优秀的程序员。这正是我希望在新一代看到的——关注、质疑权威、独立思考和推理。
标签: c++ operator-overloading pass-by-reference