第3章感受(一)——3.8.Hello objectメンバー版


[ディレクトリに戻る]
白話C++
3.8. Hello objectメンバー版
前例では「何なのかわからない」Objectタイプを定義した.最初は空っぽのタイプでした
struct Object
{

};

その後、カスタム構造と構造関数を追加しました.
struct Object
{
Object()
{
std::cout << "Hello world!" << endl;
}

~Object()
{
std::cout << "Bye-bye world!" << endl;
}
};

そこで、このタイプのオブジェクトはカスタマイズされた「生」と「死」の過程を持っているが、対象の「生」と「死」を光で議論するのは、あまりにも形而上的で、哲学的で、私たちはどのように「抽象」から「具体」に移行するかを考えなければならない.
読者はコンピューターゲームをしたことがありますか?ゲームには「魔獣」があり、「魔獣」には通常以下の特徴があります.
第一に、内部には通常「血気値」がある.
第二に、対外的には通常「攻撃」能力がある.
第三に、内部の「血気値」は対外の「攻撃」能力と少し関連している.
ゲームソフトのデザインについてお話しします.これだけで十分だからです.この3つのポイントは、C++のすべての「オブジェクト」が共有する特徴を示しています.C++プログラムだけでなく、現実の「対象」もそうです.
「重要」「対象」は何を表していますか?
第一、オブジェクト所有属性
第二に、対象の保有能力
第三に、オブジェクトの属性が変化し、その能力に影響を与えることが多い.
「自動車」を考えてみましょう.自動車の内部には「油」がある.自動車の外在能力は「走ることができる」.しかし、車は油が切れたら、逃げません.
オブジェクトが持つ特徴を「メンバーデータ」、持つ能力を「メンバー関数」と呼びます.
人間は最も複雑な「対象」の一つである.「飢餓度」、「情緒値」、「健康度」など、「メンバーデータ」がたくさんあるからです.人の能力はもっと多くなって、例えば“ラサを食べて飲みます”--すべてどんな能力に及ばないようで、更に:“詩書の琴の絵”など--現代人は少し困難なようで、更に下に言って、また哲学を始めるようで、人はきっと“死ぬ”ため、残念ながら関数を解析して前の授業で言ったことがあります.
プログラムでは、私たちが本当に「タイプ」で「人間」を表現すると、一人のすべての生物の、社会の属性と能力をコードにマッピングするのに苦労することはありません.我々は、現在のプログラムが処理する必要性のみに対して、特定の態様における「人」のデータと能力を切り取り、C++タイプ設計の「メンバーデータ」と「メンバー関数」で表現します.
このセクションでは、例コードを書くために「人」を使う準備をします.カリキュラムの必要に応じて、「人間」のどの属性と能力を使用するかを選択します.私に意見がある人類学者はいないと思います.
Code::Blocksで「HelloOOMember」という名前のコンソールアプリケーションを作成してください.必要に応じて、ウィザードで自動的に作成されたmainを開きます.cppファイルをエンコードして「システムデフォルト」に変更します.
まず空いている「人」類をください.
struct Person
{

};

次に、人間の生死関数を追加します.
struct Person
{
Person()
{
cout << "Wa~Wa~" << endl;
}

~Person()
{
cout << "Wu~Wu~" << endl;
}
};

3.8.1.メンバーデータ
このセクションでは、Personの最初のメンバーデータ:名前を追加します.紙面を無駄にしないために、次の例のコードでは、前に現れた内容を削除しますが、皆さんが「感じ」を持っているように見えるように、削除された内容を、文字の説明に変えます.
struct Person
{
// :

string name;
};

新しく追加されたメンバーデータは、タイプがstring、変数名がnameです.stringタイプを正しくコンパイルできるようにmain.cpp 002行目に追加:
#include
このメンバーデータの使用方法を見てみましょう.
021 int main() 
{
023 Person xiaoA;
024 xiaoA.name = "Xiao A";

026 Person *xiaoB = new Person;
027 (*xiaoB).name = "Xiao B";
028 delete xiaoB;

029 return 0;
}

プログラムでは,Personのオブジェクトを2つ定義した.ここでxiaoAは「スタックオブジェクト」であり、xiaoBは「スタックオブジェクト」である.
024行では、オブジェクトのメンバー・データにアクセスする方法を示します.
024 xiaoA.name = "Xiao A";
この行は「=」の右側の値を「=」の左のオブジェクトに割り当てます.
オブジェクトを使用してメンバーデータにアクセスすると、構文は簡単です.
オブジェクトメンバーデータ
しかし、027行目は少し違います.
027 (*xiaoB).name = "Xiao B";
それはxiaoBがスタックオブジェクトだからです.スタックオブジェクトの「正体」は「*xiaoB」です.したがってスタックオブジェクトについてはxiaoAと書く.name;スタックオブジェクトについては*xiaoBと書くはずだった.nameです.では、なぜカッコが必要なのでしょうか.ここでのカッコの役割は、(1+2)*3のカッコで、オペレータの優先度を変更します.C++では、[星](Star)オペレータの優先度が[点](Points)よりも低いため、*xiaoB.nameは*(xiaoB.name)に相当し、これは私たちが望んでいるものではありません.私たちが望んでいるのは:(*xiaoB).name.
このように写実的には少し回り道があるので、C++は"->"操作を提供してスタックオブジェクトに使用されるので、027行のもっと一般的な書き方は:
 xiaoB->name = "Xiao B";

次に,027行を一般的な書き方に変更するほか,2つのオブジェクトのnameメンバーを表示するためのコードを追加する.
int main()
{
Person xiaoA;
xiaoA.name = "Xiao A";

Person *xiaoB = new Person;
027 xiaoB->name = "Xiao B";

029 cout << xiaoA.name << endl;
030 cout << xiaoB->name << endl;

032 delete xiaoB;

return 0;
}

以上のコードをコンパイルして実行してください.次の実行結果を示します.
(図25メンバーデータアクセス)
[教室の宿題]:キーワードdeleteの復習
上記のコードのうち、030行と032行のコード位置を考慮して、調整してもいいですか?実際に手を出して、この2行のコードを位置を交換し、コンパイルして実行する必要があります.結果を見てみましょう.
 
3.8.2.メンバー関数
Personに追加された最初のメンバー関数、またはその最初の能力は自己紹介です.
struct Person
{
// :

018 void Introduction()
019 {
020 cout << "Hi, my name is " << name << "." << endl;
021 }

std::string name;
};

[ヒント]:メンバーデータと関数の場所
構造と解析関数をタイプ定義の一番前に、他のメンバー関数を真ん中に、メンバーデータの一番後ろに置くのが、今のC++界で流行しているスタイルですよ.
 
018~021行はメンバー関数を定義します.コンストラクションまたはコンストラクション関数とは異なり、メンバー関数は戻り値のタイプを指定する必要があります.この例では、自己紹介という動作は戻る必要がないので、voidとします.
Introduction関数があれば、main関数の出力を置き換えることができます.
int main()
{
Person xiaoA;
xiaoA.name = "Xiao A";

Person *xiaoB = new Person;
xiaoB->name = "Xiao B";

034 xiaoA.Introduction();
035 xiaoB->Introduction();

delete xiaoB;

return 0;
}

034行と035行が置き換えられ、アクセスとメンバー関数のアクセスデータは構文に差がなく、「スタックオブジェクト」と「スタックオブジェクト」を区別していることもわかりました.
この例のプログラムをコンパイルし、実行してください.
[ディレクトリに戻る]
白話C++