2017年11月08日
《その110》 クラスオブジェクトの自己初期化(p.502演習14-2)
次の IntArrayクラスのオブジェクト x を自己初期化 ( IntArray x = x; ) してみました。
------------------------------------------------
// IntArray.h
#ifndef ___Class_IntArray
#define ___Class_IntArray
class IntArray {
int nelem;
int* vec;
public:
IntArray(int size) : nelem(size) { vec = new int[nelem]; }
IntArray(const IntArray& x);
~IntArray() { delete[] vec; }
int size() const { return nelem; }
IntArray& operator=(const IntArray& x);
int& operator[](int i) { return vec[i]; }
};
#endif
// IntArray.cpp
#include "IntArray.h"
IntArray::IntArray(const IntArray& x) {
nelem = x.nelem;
vec = new int[nelem];
for (int i = 0; i < nelem; i++)
vec[i] = x.vec[i];
}
IntArray& IntArray::operator=(const IntArray& x)
{
if (&x != this) {
if (nelem != x.nelem) {
delete[] vec;
nelem = x.nelem;
vec = new int[nelem];
}
for (int i = 0; i < nelem; i++)
vec[i] = x.vec[i];
}
return *this;
}
// IntArrayTest.cpp
#include <iostream>
#include "IntArray.h"
using namespace std;
int main()
{
IntArray x = x; // 自己初期化
cout << "x.size() … " << x.size() << '\n';
cout << "x[0] … " << x[0] << '\n';
// x[0] = 100; // エラー
// cout << "x[0] … " << x[0] << '\n';
}
------------------------------------------------
新版明解C++入門編 p.502 演習14-2
クラス InyArray のオブジェクトを自己初期化する宣言 IntArray x = x; では、オブジェクト x のデータメンバ nelem と vec が不定値で初期化される。自己初期化が行われた際に、データメンバを不定値で初期化しないようにコピーコンストラクタを改良せよ。
// IntArray.h
#ifndef ___Class_IntArray
#define ___Class_IntArray
class IntArray {
int nelem;
int* vec;
public:
class IdxRngErr {
private:
IntArray* ident;
int idx;
public:
IdxRngErr(IntArray* p, int i) : ident(p), idx(i) { }
int index() { return idx; }
};
explicit IntArray(int size) : nelem(size) { vec = new int[nelem]; }
IntArray(const IntArray& x);
~IntArray() { delete[] vec; }
int size() const { return nelem; }
IntArray& operator=(const IntArray& x);
int& operator[](int i) {
if (i < 0 || i >= nelem)
throw IdxRngErr(this, i);
return vec[i];
}
};
#endif
// IntArray.cpp
#include "IntArray.h"
IntArray::IntArray(const IntArray& x) {
if (&x == this) {
nelem = 1;
vec = new int[1];
}
else {
nelem = x.nelem;
vec = new int[nelem];
for (int i = 0; i < nelem; i++)
vec[i] = x.vec[i];
}
}
IntArray& IntArray::operator=(const IntArray& x)
{
if (&x != this) {
if (nelem != x.nelem) {
delete[] vec;
nelem = x.nelem;
vec = new int[nelem];
}
for (int i = 0; i < nelem; i++)
vec[i] = x.vec[i];
}
return *this;
}
// IntArrayTest.cpp
#include <iostream>
#include "IntArray.h"
using namespace std;
int main()
{
IntArray x = x;
cout << "x.size() … " << x.size() << '\n';
cout << "x[0] … " << x[0] << '\n';
x[0] = 100;
cout << "x[0] … " << x[0] << '\n';
}
--
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/6945874
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック