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; }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/08/10 15:04
2019/08/10 15:30