析构函数之前可以工作.如何去做
destructor works before . How?
#include<iostream>
using namespace std;
class test
{
int a;
public:
test()
{
a=0;
}
test operator ++(int)
{ a++;
return *this;
}
void display()
{
cout<<a;
}
~test() {
cout << "DES" << endl;
}
};
int main()
{
test t,t1;
t1 = t++;
t.display();
system("pause");
}
我得到的输出是:
DES
1Press any key to continue...
DES
DES
为什么析构函数之前可以工作?
表达式t++
的结果是test
类型的临时对象,因为operator++(int)
返回值为[*]。在operator=
用它赋给t1
的新值之后,你看到了这个临时变量的破坏。
[*]通常情况下,这应该包含t
的值之前被增加,但在你的实现中,它只是一个对象的副本后增加,你做return *this;
创建。所以你的函数体更适合operator++()
(前增量)而不是operator++(int)
(后增量)。
因为
t1 = t++;
创建一个临时对象,该对象将在表达式(;)结束时销毁。
当您使用t++
时,将创建一个临时对象。这就是为2个变量调用3个析构函数的原因。如果使用++t
,则不会创建临时对象。除运算符优先级外,这是前递增和后递增的主要区别。
原因是
test operator ++(int)
{
a++;
return *this;
}
返回一个临时对象,一旦被立即销毁
t1 = t++;
在调用system()
之前执行
operator ++(int)
按值返回,而不是按引用返回。创建和销毁临时文件
如果您希望++
的行为与内置类型一样,则:
- 预增量(
++t
)应该递增,然后返回新值(可以通过引用返回); - postincrement (
t++
)应该复制原始值,并在递增后返回。
你的后增量混合了两者;它增加,然后返回新值的副本,(即像预增量一样,但有一个不必要的副本)。当临时副本在创建它的完整表达式的末尾被销毁时,您将看到额外的析构函数调用。
一个更规范的实现看起来像:
test & operator++() {
++a;
return *this;
}
test operator++(int) {
test copy = *this;
++a;
return copy;
}
相关文章:
- 试图弄清楚我需要做哪些更改才能使代码正常工作.使用Visual Studio
- 我需要做什么才能使ZMQ_RADIO/ZMQ_DISH正常工作?
- 在 main() 中传递C++命令行参数,但要做同样的工作
- 保留将来要做的工作清单
- C++:去引用实际上在做什么
- 如果malloc/free对显然做了同样的工作,为什么C++标准库容器使用内存池
- 从一个字符串中获取 2-5 个连续的单词短语,我得到了 2 个工作,但在做 3 个时遇到麻烦
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 如何使用ODEINT的标签系统为各种步进器类型做特定工作
- ShellExecute不工作,或者我做错了什么
- Android NativeActivity.如何在其他方面做一些工作
- 我做的平均过滤器是否正确?我需要更改什么才能使其正常工作
- 做系统();命令的工作方式与批处理命令完全相同
- 我无法让 Netbeans C++工作,我做错了什么?
- 在TCHAR**中查找TCHAR*的个数.如何去做
- 我的模板不工作(c++)-我做错了什么
- 析构函数之前可以工作.如何去做
- 是否有可能将通用队列从c++传递到vb.net?如何去做
- 可能使一个单例结构在c++ ?如何去做
- 指针值超过可用内存?如何去做