我对构造函数和析构函数的技术原因有点陌生。我编写了一个程序,其中包含显示对象开始状态、结束状态、内存位置、值以及何时调用构造函数和析构函数的函数。
我无法理解为什么在他们被调用时调用它们以及它们实际上在做什么。我将发布测试运行的结果和我正在使用的代码 - 以及我所知道的哈哈。
结果:
Constructor called on 0x7fffc053f070
Initial state:
Location: 0x7fffc053f070
Value: 0
--- FOO ----
Location: 0x7fffc053f070
Value: 1
--- BAR ----
Location: 0x7fffc053f080
Value: 2
Destructor called on 0x7fffc053f080
--- BAZ ----
Location: 0x7fffc053f070
Value: 2
Final state:
Location: 0x7fffc053f070
Value: 2
Destructor called on 0x7fffc053f070
代码:
#include <iostream>
#include <vector>
using namespace std;
//Short memory addresses are on the heap
//Long memory addresses are on the stack
class A {
public:
A(){
m_iValue = 0;
cout << "Constructor called on " << this << endl;
}
/* A(const A & a){
m_iValue = a.m_iValue;
cout << "Copy constructor called on " << this << endl;
}
*/
void increment(){
m_iValue++;
}
void display(){
cout << "Location: " << this << endl;
cout << " Value: " <<m_iValue << endl;
cout << endl;
}
virtual ~A(){
cout << "Destructor called on " << this << endl;
}
private:
int m_iValue;
};
void foo(A & a){
a.increment();
a.display();
}
void bar(A a){
a.increment();
a.display();
}
void baz(A * a){
a->increment();
a->display();
}
void blah(vector<A*> vA){
vA.back()->display();
delete vA.back();
vA.pop_back();
}
int main(int argc, char * argv[]){
A a;
cout << "Initial state: " << endl;
a.display();
cout << endl;
foo(a);
bar(a);
baz(&a);
cout << endl;
cout << "Final state: " << endl;
a.display();
return 0;
}
我相信正在发生的事情:
因此,构造函数被调用一次,而析构函数被调用两次。在 main 中创建对象时调用构造函数。在 foo() 中,m_iVariable 通过引用传递,并且函数在内存中的该位置为对象增加 m_iValue。因此程序将值显示为 1(从 0 递增。)
这就是我感到困惑的地方。第三个位置与前两个位置不同。该对象被直接传递给 bar()。我不明白如果不调用构造函数,位置会如何不同,或者为什么在它递增后调用析构函数,使值 2。
但是 baz 也会增加值。所以这意味着 bar 实际上没有做任何事情?我仍然不明白 bar 如何显示新的内存位置并破坏,但从不构造。
对不起所有的文字,但任何事情都会有所帮助。谢谢!
哦,注释掉的代码,函数 blah 用于其他事情,与这个问题无关。