私はコンストラクタとデストラクタの技術的な理由に少し慣れていません。オブジェクトの開始状態、終了状態、メモリ位置、値、およびコンストラクタとデストラクタが呼び出されたときに表示する関数を使用してプログラムを作成しました。
彼らがなぜ呼ばれるのか、そして彼らが実際に何をしているのか理解するのに苦労しています。テスト実行の結果と使用しているコード、そして私が知っていることを投稿します。
結果:
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;
}
私が信じていることは起こっている:
したがって、コンストラクタは1回呼び出され、デストラクタは2回呼び出されます。コンストラクターは、オブジェクトがmainで作成されるときに呼び出されます。foo()では、m_iVariableが参照によって渡され、関数はメモリ内のその場所にあるオブジェクトのm_iValueをインクリメントします。したがって、プログラムは値を1(0からインクリメント)として表示します。
これは私が混乱するところです。3番目の場所は最初の2つの場所とは異なります。オブジェクトはbar()に直接渡されます。コンストラクターを呼び出さずに場所がどのように異なるのか、またはインクリメント後にデストラクタが呼び出されて値が2になる理由がわかりません。
ただし、bazも値をインクリメントします。つまり、バーは実際には何もしなかったということですか?バーが新しいメモリ位置を表示して破棄する方法がまだわかりませんが、構築することはありません。
すべてのテキストで申し訳ありませんが、何でも役に立ちます。ありがとう!
ああ、コメントアウトされたコード、そして関数blahは他のことに使用されており、この質問には相対的ではありません。