和 ;? 之间的区别?
Difference between , and ;?
>EDIT看起来我没有很好地解释自己。我的问题不是关于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(; mostrar(l2(; mostrar(l3(;相反,我们将遇到预期的错误,最后一次调用将无法正确显示最后一次调用,因为复制没有正确完成。 你知道使用 和 ; 之间的区别是什么吗?为什么当你使用时这段代码有效?
您尚未编写复制构造函数或复制赋值运算符。3 法则告诉我们,无论何时编写析构函数,复制赋值运算符和复制构造函数也应该如此。你也没有写,所以让我们看看会发生什么:
l3 = l1
在此行中调用隐式定义的复制赋值运算符,该运算符将定义如下:
Libro& Libro::operator=(const Libro& rhs) {
this.tiulo_ = rhs.titulo_;
this.paginas_ = rhs.paginas_;
}
- >
this.tiulo_ = rhs.titulo_
这意味着l1
和l3
对象都指向由l1
的构造函数动态分配的"Fundamentos de C++"字符串 l3.~Libro()
被隐含地调用,因为l3
离开了范围,这将调用delete [] titulo_
破坏l3
的"Fundamentos de C++"动态分配的成员,这也是l1
的titulo_
成员。l1.~Libro()
也是隐式调用的,但是这次该成员被l3
离开范围删除,这将调用delete [] titulo_
用于已删除的指针:
将其传递给释放函数(双重删除(是未定义的行为
因此,您的问题不是,
与;
,而是因不遵循 3 法则而导致的双重删除。
创建一个复制构造函数和复制赋值运算符,不如建议你取消Libro
并在"配对"中使用string
,你的代码会像这样简单:
pair<string, int> l1 = make_pair("Fundamentos de C++"s, 474), l2 = make_pair("Por Fin: C ISO"s, 224), l3;
这当然需要你显式输出每个成员,例如:
cout << l1.first << " tiene " << l1.second << " paginasn" << l2.first << " tiene " << l2.second << " paginasn" << l3.first << " tiene " << l3.second << " paginasn";
现场示例
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- & 和 * 之间的区别
- std::is_convertible 和 std::convertible_to 之间的区别(在实践中)?
- 析构函数和'delete'之间的区别
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 函数签名与调用的函数不匹配,常量字符[]和字符*之间的区别?
- OpenMP #pragma omp for v/s #pragma omp parallel for 之间的区别?
- S() 与 S{} 之间的区别?