質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

327閲覧

クラス配列でデスストラクタが動いてしまってる理由が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/08/10 14:01

編集2019/08/10 14:10

main関数部の一行の配列のコードなのですが派生クラスであるderiverdクラスを設定したときになぜコピーコンストラクタとデストラクタが動いてしますのでしょうか?コピーコンストラクタは宣言だからとかそれ以上の理由はないと判断したとしても
1,デストラクタが呼ばれる理由が知りたいです。

#include <iostream> #include <ctime> #include <cstdlib> class base { private: int *ar = NULL; int d = 0; public: base(int x) { d = x;//配列の個数 ar = new int[x]; for (int i = 0; i < x; i++) { ar[i] = rand() % 100; } std::cout << "base\n"; } base(const base& x)//コピーコンストラクタ { if (this != &x) { if (this->d == x.d) { for (int i = 0; i < d; i++) { this->ar[i] = x.ar[i]; } } else { if (this->d < x.d) { //int r = x.d - this->d; for (int i = 0; i < this->d; i++) { this->ar[i] = x.ar[i]; //delete(this->ar); } } else { //int r = this->d - x.d; for (int i = 0; i < x.d; i++) { this->ar[i] = x.ar[i]; // delete(x.ar); } } } } std::cout << "copy constructor\n"; } ~base() { delete(ar); std::cout << "base Destructor\n"; } //void f()//オーバーライド virtual void f()//オーバーライド { std::cout << "base f()\n"; //std::cout << a << std::endl; } void p() { for (int i = 0; i < d; i++) { std::cout << "ar[" << i<<"]: "<< ar[i] << std::endl; } } base& operator = (const base& x) { std::cout << "base operator = \n"; if (this != &x) { if (this->d == x.d) { for (int i = 0; i < d; i++) { this->ar[i] = x.ar[i]; } } else { if (this->d < x.d) { //int r = x.d - this->d; for (int i = 0; i < this->d; i++) { ar[i] = x.ar[i]; //delete(this->ar); } } else { //int r = this->d - x.d; for (int i = 0; i < x.d; i++) { this->ar[i] = x.ar[i]; // delete(x.ar); } } } return *this; } } void x(int t) { std::cout << t <<"x()\n"; } }; class derived : public base { public: derived(int t):base(t) { std::cout << "deirved\n"; } void x(int x) { std::cout << "d x()\n"; std::cout << x; } ~derived() { std::cout << "derived Destructor\n"; } void df() { std::cout << "df()"; } void f() override { std::cout << "deiverd f()\n"; //std::cout << a << std::endl; // return 3; } }; int main() { base* idx = new base[5]{ derived(1),base(1),base(1),base(1),base(1) }; int c_ = getchar(); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

c++

1base d[] = {derived(1)};

c++

1base d = derived(1);

と、大体等しく

コピーして新しくbaseのインスタンスを作る事になるから

投稿2019/08/10 14:35

編集2019/08/10 14:38
asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/10 15:04

もう少し詳細にお願いですか、base b = derived(1);はまずコピーコンストラクタが実行されてから デストラクタが動いていますが
KoichiSugiyama

2019/08/10 15:30

横からすみません。 スコープに着目するとasmさんが書かれた内容を理解しやすいと思います。 base d[] = { derived(1), }; は base d[] = { (0番目の要素) = derived(1) }; とまずオブジェクトのコピーが行われます(ここでコピーコンストラクタが呼ばれる)。 そのあと、処理は { } のスコープを外れるので、derived(1)で作ったインスタンスが破棄されます。 そのためデストラクタが動くと考えてください。
guest

0

main関数内でインスタンスが使われていない>なら不要なものなので破棄しておく
ということだと。
べつにおかしなはなしではないですね

#で、ローカルスコープで生成したインスタンスはスコープから抜けるときに破棄されます

投稿2019/08/10 15:24

編集2019/08/10 15:26
y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問