C++スコーラ

オブジェクトポインタ,newとdelete

最終更新:

cschola

- view
管理者のみ編集可

オブジェクトポインタとは

※こちらも参照 オブジェクト
通常のポインタと同様、クラスに対してもポインタで扱うことができる。

クラス型のポインタpはobjを指すようになる。
Person obj;
Person *p = &obj;
ポインタの場合、各変数や関数にアクセスする時は
下の例のように->(アロー演算子)を使用する。
p->age;
p->selfIntroduction();



メモリの動的確保と解放(malloc & free、 new & delete)


new 演算子

C、C++の配列は動的な配列の確保ができない。
new演算子を使うとメモリの動的確保が可能になる。
new,deleteはC++ の演算子なのでincludeの必要はない。
cの<stdlib.h>にあるmalloc と freeでも使用可能
ただし、演算子オーバーロードが使えない、コンストラクタ、デストラクタが呼び出せないため、C++ではnew と deleteを使う。


例:
double a[10];	// 静的な確保はOK

int n;
cin >> n;	// キーボードから入力
double b[n];	// NG コンパイルエラーになる



 mallocの詳細
形式: #include <stdlib.h>

void *malloc(size_t size);

機能: 大きさsizeのメモリ領域を確保する。
引数: size: 確保したいメモリのバイトサイズ。
返却値: 成功した時:確保したメモリブロックを示すポインタ
失敗した時:NULL


例1:mallocによる動的確保とfreeによる領域解放
#include <

例2:newによる動的確保とdeleteによる領域確保

#include <


二次元配列の場合の動的確保

通常の二次元配列(b[][])だと動的確保ができないので、ポインタ配列を使って擬似的に作り出します。
以下がソースコードです。
#include <


クラスのオブジェクトの動的確保について

※クラスのオブジェクトの場合、標準入力からのオブジェクトの動的確保はできません。
動的確保ができないので、set関数を使ってnewした後に値を与えます。

Person.h

#include < string >
 
 
class Person{
private:
        std::string name;
        int age;
        float height;
        float weight;
        int id;         //人を識別するためのID
        static int sum_person;  //Personオブジェクトの総数保存変数
public: 
        Person(void);
        ~Person(void);
        void setStatus();       //set関数
        void selfIntroduction();
};


Person.cpp

#include "Person.h"
#include < iostream >
using namespace std;
int Person::sum_person=0;       //static変数
//デフォルトコンストラクタ
Person::Person(void){
        Person::sum_person++;   //総数+1
        this->id=sum_person;    //現在の総数をIDとして代入
}
//デストラクタ
Person::~Person(void){
}

void Person::setStatus(){
        cout<<"ID:"<id<<"のデータを入力します。"<< endl;
        cout<<"名前を入力:"<> this->name;
        cout<<"年齢を入力:"<> this->age;
        cout<<"身長を入力:"<> this->height;
        cout<<"体重を入力:"<> this->weight;
        cout<<"データの入力が完了しました。"<<< "私の名前は" << this->name<<"です。"<<<"年齢は"<age<<"歳で、身長は"<height <<"cmで、体重は"<weight << "kgです。" << endl;
}

main.cpp

#include "Person.h"
#include <

memo
※static変数は、明示的に初期値を与えなかった場合には、自動的に 0 で初期化される。
※インスタンスを生成しなくても、静的メンバ変数だけは存在している。
※静的メンバ変数を宣言した場合、その実体の定義をクラス定義の外側に記述する必要がある。
 cpp の"include の下あたりに クラス名::変数名=値;で定義する。

問題

問題1

HumanとBoxの2つのクラスを作成しmainでオブジェクトを2つ生成せよ。
HumanとBoxは下記の仕様で作成せよ。

Humanクラス
private
 性質:string型 name
public
 操作:putBall
  返り値:なし 
  引数1 :整数型 num(玉を入れる個数)
  引数2 :Box型 *b (どのBoxに入れるか)
  指定された (Box b) に引数1で指定した(num)個ボールを入れる操作を行う

コンストラクタ
 引数:string name
 引数を使ってnameをセットする。

Boxクラス
private
 性質:整数型 capacity(容量)
   :整数型 ballnum(持っているボールの個数)
public
 操作:addBall
  返り値:なし
  引数1:整数型 num
  num個持っているボールを持っているボールの個数に加算する。
  容量以上のボールはあふれるように処理し、溢れたことを標準出力でユーザに伝える。

  :dispBallnum
  返り値:なし
  引数:なし
  現在のボール個数を画面に出力する。

コンストラクタ
 引数1 整数型 capacity
 引数2 整数型 ballnum
 引数を使って箱の容量と入っているボール個数の初期値をセットする。

main
 Human(taro,jiro)とBox(b1,b2)のオブジェクトを2つ生成
 b1:初期値は容量10,現在のボール数0
 b2:初期値は容量20,現在のボール数5
 各Boxの現在の個数を標準出力
 taroはb1に玉を10個入れる
 jiroはb2に玉を15個入れる
 各Boxの現在の個数を標準出力
 taroはb2に玉を10個入れる
 jiroはb1に玉を15個入れる
 各Boxの現在の個数を標準出力
 生成したオブジェクトを削除
 プログラム終了



testcounter
合計 -
今日 -
昨日 -
目安箱バナー