アフィリエイト広告を利用しています

広告

posted by fanblog

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';

}
------------------------------------------------

c14_0005.png



新版明解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';
}

c14_0006.png


新版 明解C 入門編 (明解シリーズ)

新品価格
¥2,916から
(2017/8/30 21:02時点)









--
この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/6945874
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。