プログラミング言語はC++
C++を触り始めたばかりの素人です。
コンストラクタとデストラクタについて質問です。
下記に参考にしているウェブページから簡潔にしてコードを書いてみました。
コンストラクタ、デストラクタの中はそれぞれに、○○が呼び出されましたと書いてあるだけでよく分からなかったので別のウェブページを見たら
コンストラクタは Sample::Sample(){ n=0; } みたいな例があったのですが、このように変数に予め何かの値を代入しておくという事で合ってますか?
デストラクタは理解できていません。
下記の例では、どのような処理を書けばいいのでしょうか?
#include<iostream>
using namespace std;
class Sample
{
private:
int n;
public:
void Show();
Sample();
~Sample();
};
void Sample::Show()
{
cout << n << endl;
}
Sample::Sample()
{
//n=0;
std::cout << "コンストラクタが呼び出されました" << std::endl;
}
Sample::~Sample()
{
//どんな処理?
std::cout << "デストラクタが呼び出されました" << endl;
}
main()
{
Sample sample;
sample.Show();
return 0;
}
実行結果
コンストラクタが呼び出されました
1 ←コンストラクタ関数内の//を削除で0になることは確認
デストラクタが呼び出されました
No.1
- 回答日時:
コンストラクタには前準備(初期化)、デストラクタには後始末を書きます。
たとえば:
class testfile {
FILE* fp;
public:
textfile(const char* fname) { fp = fopen(fname,"r"); }
~textfile() { fclose(fp); }
...
};
episteme様へ
int型の変数を定義するだけじゃデストラクタは必要がないみたいですね。
私の見た例では、提示したソースコードのようにint型の変数を1つ定義してあるだけだったので、理解に苦しみましたが、他の例を挙げてもらえたおかげで理解できたと思います。
ファイルの入出力でコンストラクタとデストラクタを使うのですね。
C言語もやったことはありますが、確かに開いたファイルは閉じろと言われてたのを思い出しました。
こういう前準備と後始末の一連の動作をコンストラクタとデストラクタの関数で行うと、なるほどと思いました。
ありがとうございました。
No.2ベストアンサー
- 回答日時:
この例だとデストラクターでやる処理は何もないですね。
このクラスから生成されたオブジェクトが消えるときに、消し残したものはできませんので。
たとえば、このクラスの中でnewなどでほかにメモリーを確保している場合、ネットワークの接続をしている場合は、このクラスが消えるときに明示的にそれらの終了処理を書いておかないとそれらのリソースが残るので、デストラクターでの処理が必要になります。
たとえば、
#include<iostream>
using namespace std;
class Sample
{
private:
int* n;
public:
void Show();
Sample();
~Sample();
};
void Sample::Show()
{
cout << n[0] << endl;
}
Sample::Sample()
{
n = new int[1]; // メモリーを動的に確保
for (int i = 0; i < 1; i++) {
n[i] = 0;
}
std::cout << "コンストラクタが呼び出されました" << std::endl;
}
Sample::~Sample()
{
delete [] n; // デストラクタで確保したメモリーを解放
std::cout << "デストラクタが呼び出されました" << endl;
}
int
main()
{
Sample sample;
sample.Show();
return 0;
}
ただ、今時はSTLやスマートポインターを使ってプログラムを書くのがC++では普通だと思いますので、デストラクターで明示的に何かの処理を書くのは珍しくなってきているかもしれません。メンバー変数をvectorやstring、スマートポインターにしてあるとそれらのデストラクターがちゃんとメモリーを解放してくれますし、メモリー周りのバグを減らすためにそういう書き方をするほうが推奨だと思いますので。
hanabutako様へ
質問時に提示したソースコードは、ごちゃごちゃしていたコメントを消して、自分好みに変数名を少し変えただけで処理的には何もいじってなく、ほぼ丸々コピーした状態のものです。
実際に使っている例ではなく、単に書き方を説明しているだけなのかなと思えてきました。
説明の書いてあるページには、newや、他の方にご回答頂いた例のファイルの入出力等の実際に使っている例はなく理解するには難しいものでしたが、提示したソースコードを修正して頂いたおかげで簡潔で分かりやすかったです。
ありがとうございました。
No.3
- 回答日時:
コンストラクタはクラスのインスタンスが発生した際に呼び出されます。
主にメンバ変数の初期化に使います。また、初期化時に行いたい処理も書けます。例えば、ミューテックスやセマフォハンドルの生成とか、クラスをのサブルーチンで共通で使うファイルを開くとか。
逆にデストラクタは、インスタンスが消滅する際に呼び出されます。
使っていたハンドルが閉じてなかったら閉じるとか、開いてあるファイルを閉じるとか。
コンストラクタはインスタンスの生成で呼ばれますから、newした時や、newしない変数定義に呼ばれます。
void test()
{
Sample sam; //samのインスタンス発生なので、コンストラクタ呼び出し
Sample* pSam; //pSamのインスタンスはまだ発生してないから、コンストラクタは呼び出さない
sam.Show();
pSam = new Sample(); //pSamのインスタンス発生なので、コンストラクタ呼び出し
pSam->Show();
delete pSam; //pSamのインスタンス消滅なので、デストラクタ呼び出し
return; //samのインスタンス消滅なので、デストラクタ呼び出し
}
unacyo様へ
ミューテックス、セマフォハンドルの生成・・・例を挙げて頂けたのはありがたいのですが、調べてもよく分かりませんでした。
これらは、メモしておいて今後、理解したいと思います。すみません。
初期化を行うことと呼び出しのタイミングは理解しました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashの変数でブランクがあるかチェックする方法教えて下さい。 3 2023/04/06 16:09
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- Windows 10 bash の -z オプションがうまく動作しない原因を教えて下さい。 4 2023/03/22 18:04
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) 標準モジュール Public mOnTime As Date Sub sample() '実行プロシ 1 2023/02/22 15:44
- Excel(エクセル) 日本情報処理表計算について。 4 2022/08/28 21:46
- JavaScript functionはhtmlやjsに2度使えませんか 2 2022/08/03 19:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
変数名の付け方
-
生成したインスタンスを削除す...
-
VB.NET getとsetの概念がわかり...
-
C# インスタンスの破棄
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
-
複数の変数を宣言する時、同時...
-
[Visual C#] 優先される処理に...
-
サーブレットでレスポンスが返...
-
インスタンスを同じ名前で作成...
-
文字列を日付に変換でParseExce...
-
エクセル(複数インスタンス)...
-
サーブレットのスレッド管理に...
-
C#のスレッド処理について、ご...
-
MDIでフォームがアクティブにな...
-
VB6.0で、DLLを動的に参照したい
-
インスタンス生成で、○○.xxx();...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
VB.NET getとsetの概念がわかり...
-
C#において、同じインスタンス...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
newしないインスタンス?実体化...
-
SQLを連続発行する時の正しい(?...
-
「インスタンス」の意味をわか...
-
文字列を日付に変換でParseExce...
-
変数の参照でエラーが出てしま...
-
フォームの存在をチェックする方法
-
javaのクラスの作り方、エラー...
-
オブジェクト参照がオブジェク...
-
String a = "a"; と String b =...
-
エクセル(複数インスタンス)...
-
C#「オブジェクト参照が必要で...
-
他のファイルの変数参照
おすすめ情報