gpt4 book ai didi

c++ - 通过引用传递——为什么要调用这个析构函数?

转载 作者:太空狗 更新时间:2023-10-29 21:33:02 26 4
gpt4 key购买 nike

我找不到(关于析构函数调用主题的许多问题)任何与我的情况完全相同的问题。

为什么传递的参数是引用时调用析构函数?我在我认为执行输出的代码行下方放置了注释(主要在 main 中)。

struct X { // simple test class
int val;

void out(const std::string& s, int nv)
{
std::cerr << this << "–>" << s << ": " << val << " (" << nv << ")\n";
}

// default constructor
X() {
out("X()", 0);
val = 0;
}

X(int v) {
val = v;
out("X(int)", v);
}

// copy constructor
X(const X& x) {
val = x.val;
out("X(X&) ", x.val);
}

// copy assignment
X& operator=(const X& a)
{
out("X::operator=()", a.val);
val = a.val;
return *this;
}

// Destructor
~X() {
out("~X()", 0);
}
};

X glob(2); // a global variable
// Output Line 1: X(int): 2 (2)

X copy(X a) {
return a;
}

主要函数:

    int main()
{
X loc{ 4 }; // local variable
// Output Line 2: X(int): 4 (4)
// ^from X(int v) function
X loc2{ loc }; // copy construction
// Output Line 3: X(X&) : 4 (4)
// ^from X(const X& x) function
loc = X{ 5 }; // copy assignment
// Output Line 4: X(int): 5 (5)
// ^from X(int v) function
// Output Line 5: X::operator=(): 4 (5)
// ^from the '=' operator overload
// Output Line 6: ~X(): 5 (0) - ???
loc2 = copy(loc); // call by value and return
// Or does Output Line 6 result from here?
.
.
.
}

1) 这个析构函数被调用是因为 loc = X{ 5 };//复制赋值 或之后的行:loc2 = copy(loc);//按值调用并返回?

2) 为什么要调用它?据我所知,析构函数仅在以下情况下调用:

a) names go out of scope
b) program terminates
c) "delete" is used on a pointer to an object

我知道它不是“b”或“c”,所以一定是因为某些事情超出了范围。但我认为超出复制赋值函数范围的引用不会造成这种情况。

最佳答案

您可以看到在复制赋值发生后不久就调用了析构函数。复制赋值完成后,临时(x{5})被销毁。

来自标准的析构函数部分:

15.4 Destructors
...
12. A destructor is invoked implicitly
(12.1) — for a constructed object with static storage duration at program termination,
(12.2) — for a constructed object with thread storage duration at thread exit,
(12.3) — for a constructed object with automatic storage duration when the block in which an object is created exits,
(12.4) — for a constructed temporary object when its lifetime ends.

关于c++ - 通过引用传递——为什么要调用这个析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53007375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com