【发布时间】:2018-01-18 15:39:08
【问题描述】:
编辑 看来我没有很好地解释自己。我的问题不是关于 3 规则,或者如何以一种好的方式实施它。我的问题是为什么在使用逗号时析构函数在完成序列后调用,而不是在变量离开范围时调用,我的意思是,只有当逗号之间的所有函数都完成时,对象才会被销毁,你可以看到它为析构函数添加了一个 cout。
在这个例子中,
#include <iostream>
#include <cstring>
using namespace std;
class Libro {
char* titulo_; int paginas_;
public:
Libro() : titulo_(new char[1]), paginas_(0) {*titulo_= 0;}
Libro(const char* t, int p) : paginas_(p) {
titulo_ = new char[strlen(t) + 1];
strcpy(titulo_, t);
}
~Libro() { delete[] titulo_; }
void paginas(int p) { paginas_ = p; }
int paginas() const { return paginas_; }
char* titulo() const { return titulo_; }
};
void mostrar(Libro l) {
cout << l.titulo() << " tiene " << l.paginas() << " paginas" << endl;
}
int main() {
Libro l1("Fundamentos de C++", 474), l2("Por Fin: C ISO", 224), l3;
l3 = l1;
mostrar(l1), mostrar(l2), mostrar(l3);
}
尽管没有定义复制构造函数并且编译器提供的默认复制构造函数在这种情况下无效,但执行是正确的,它在对 mostrar(l1)、mostrar( l2), mostrar(l3);.
但是,如果我们使用 mostrar(l1);莫拉尔(l2); mostrar(l3); 相反,我们会遇到预期的错误,最后一次调用不会正确显示最后一次调用,因为复制没有正确完成。 你知道 use 和 ; 之间有什么区别吗?为什么当你使用 , 时这段代码可以工作?
【问题讨论】:
-
这绝对不是 c.
-
俗话说,未定义的行为是未定义的。
-
未定义的行为给你未定义的行为。你需要遵循三法则
-
未定义的行为包括“似乎有效”作为一种可能的结果。
-
抱歉所有的反对票。这是一个艰难的人群。您的问题很好,不幸的是,您偶然发现了由 2 个隐式行为引起的错误。 3/5 规则可以保护您免受此类影响,但显然这与您无关。我试图在我的回答中澄清这个问题。我还给你一个 +1 以抵消可笑的反对票数。