便利だよ、すごいんだよ、と聞かされてきた オブジェクト指向。
調べてみるも
さ っ ぱ り わ か ん ね ぇ (#^p^)
というわけで今回からクラスの勉強を始めようと思います。
将来C++のことをきれいさっぱり忘れ去ってしまった時のためになるべくわかりやすいようにしたいですね。
では早速
~とりあえずクラス宣言~
まずはクラスを宣言しなければ始まりません。
これで宣言は終わりです。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ClassClass | |
{ | |
}; |
これで宣言は終わりです。
~中身を充実させる~
クラス宣言が終わりました。
これは「こんなクラスがあるよ!」と主張しているのです!
では次に「こんなことができるんだよ!」と主張しましょう。
と、その前に
クラスにはコンストラクタとデストラクタが絶 対 に 必 要 で す !
コンストラクタとはクラスが使われるとき一番最初に実行される関数です。
デストラクタとはクラスが使われなくなる時に実行される関数です。
なんだそれ、と思う方もいるでしょう。というか、私がおもっています。
ですがそういうお約束なのです。
ここでは「おまじない」ということで納得しましょう。
コンストラクタはクラスと同じ名前、デストラクタはクラス名の前に~をつけます。
どちらも戻り値はありません。
public:ってなんだ?
「おまじない」です。(^p^)
( ){ }ってなんだ?
これはですね、( )が引数です。今回はありません。{ }が関数の中身です。これも今回はありません。
つまりなにもしません。(^p^)
これは「こんなクラスがあるよ!」と主張しているのです!
では次に「こんなことができるんだよ!」と主張しましょう。
と、その前に
クラスにはコンストラクタとデストラクタが絶 対 に 必 要 で す !
コンストラクタとはクラスが使われるとき一番最初に実行される関数です。
デストラクタとはクラスが使われなくなる時に実行される関数です。
なんだそれ、と思う方もいるでしょう。というか、私がおもっています。
ですがそういうお約束なのです。
ここでは「おまじない」ということで納得しましょう。
コンストラクタはクラスと同じ名前、デストラクタはクラス名の前に~をつけます。
どちらも戻り値はありません。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ClassClass | |
{ | |
public: | |
ClassClass(){} | |
~ClassClass(){} | |
}; |
public:ってなんだ?
「おまじない」です。(^p^)
( ){ }ってなんだ?
これはですね、( )が引数です。今回はありません。{ }が関数の中身です。これも今回はありません。
つまりなにもしません。(^p^)
~今度こそ中身を充実させる~
コンストラクタもデストラクタも作りました。
今度こそクラスの中身を充実させていきましょう。
とりあえずhello worldでも表示させてみますか。
クラスの中に関数を作っちゃいましょう。
ユーザ関数と作り方は同じです。
戻り値 名前 引数 の順番ですね。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ClassClass | |
{ | |
public: | |
ClassClass(){} | |
~ClassClass(){} | |
void Hello() | |
{ | |
cout << "hello world" << endl; | |
} | |
}; |
個人的にはcoutのほうが好きです。いろいろ便利ですし。
さて、あとはこれを実行するだけです。
とりあえずソースを貼りましょう。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
ClassClass obj; | |
obj.Hello(); | |
_getch(); | |
return 0; | |
} |
objの中のHelloにアクセスするためにobj.Hello()と書きます。
_getch()は一時停止だと思ってください。
これでhello worldと表示されましたね。
~何回も表示させる~
C言語入門だと最初のほうでループを勉強するので、こっちも対抗してループを勉強しましょう。
内容は
hello worldを任意の回数表示させる
for文でくくっちゃえば一発ですね。
せっかくクラスの勉強してるんだからクラスの中でループさせましょう。
ところでさっき作ったHelloという関数、クラスの中でも使えます。
ということは新しく関数を作って、その中でループを回してHelloを実行する、ということができそうです。
じゃあ関数名は何にしましょうか・・・。
じつはC++にはオーバーライドという機能があります。
簡単に言っちゃえば同じ名前で違う機能をもった関数を定義することができる機能です。
今回みたいに似たような内容の関数を作るときに役立ちますね。
というわけで、新しい関数の名前もHelloにけって~い!
ただ、オーバーライドにもルールがあります。
同じ名前の関数がいっぱいあって、しかもそれぞれで内容が違うとなるとややこしいですよね?
だから、オーバーライドするときは引数を変えて、区別する必要があります。
最初に作ったHelloは引数なしなので、今回作るHelloにはint型の引数を与えましょう。
引数で与えられた回数だけhello worldを表示する、というわけですね。というわけで、どん。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
void Hello(int num) | |
{ | |
for (int i = 0; i < num; i++) | |
{ | |
Hello(); | |
} | |
} |
これであとはmain文で呼んでいるHelloに好きな数字を渡せば、その回数分だけ表示してくれるってわけです。
~好きな文字を表示させる~
クラスの世界にもなじんできたことですし、いつまでもhello worldと言っている場合ではありません。
なにかかっこいいことを言わせてみましょう。I'll be back とかどうです?
というわけで、I'll be back と表示するようにしましょう。
Helloの中でI'll be back と表示するように書き換えればいいですね。
いやいや、せっかくクラスの(ry
というわけで、何を表示させるかを取得する関数を作りましょう。
ところで、今まではクラスの中では関数しか宣言していませんでしたが、実は変数も宣言できます。
しかも、その変数(メンバ変数と呼ぶ)はクラスの中の関数(メンバ関数と呼ぶ)で使うことができます。
じゃあ、何を表示させるか取得する関数、取得したものを表示する関数を作ってみましょう。
じゃあ、何を表示させるか取得する関数、取得したものを表示する関数を作ってみましょう。
というわけで、
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
string word; | |
void SetWord(string str) | |
{ | |
this->word = str; | |
} | |
void Say() | |
{ | |
cout << word << endl; | |
} |
SetWordの中で使われているthis->ですが、これは「こいつはこのクラスのメンバですよ」という意味です。無くてもいいけど、あると見やすいかもしれないです。
Sayの中は特に説明しなくても大丈夫ですね。余裕のある方は任意の回数表示できるように拡張してみてください。
Sayの中は特に説明しなくても大丈夫ですね。余裕のある方は任意の回数表示できるように拡張してみてください。
~最初に取得~
これで好きな文字を表示できるようになったわけですが、毎回毎回SetWordを呼ぶのはめんどくさいですね。
最初に初期化みたいなことができればいいのに・・・。
・・・ハッ!?
最初に・・・。最初に・・・?
最初にといえばコンストラクタとかいうものがありましたね。
これを使って初期化してみましょう。
コンストラクタの引数をstring型にして・・・。というのはアウトです。
これも「おまじない」なのですが、引数なしのコンストラクタは絶対に必要です。
新しくstring型の引数を持つコンストラクタを作りましょう。コンストラクタのオーバーロードですね。
コンストラクタの中ではSetWordを呼び出せばよさそうです。
ついでなんで引数なしのコンストラクタではwordに空白を与えましょう。
というわけで、コチラ
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class ClassClass | |
{ | |
private: | |
string word; | |
public: | |
ClassClass() | |
{ | |
SetWord(""); | |
} | |
ClassClass(string str) | |
{ | |
SetWord(str); | |
} | |
~ClassClass(){} | |
void Hello() | |
{ | |
cout << "hello world" << endl; | |
} | |
void Hello(int num) | |
{ | |
for (int i = 0; i < num; i++) | |
{ | |
Hello(); | |
} | |
} | |
void SetWord(string str) | |
{ | |
this->word = str; | |
} | |
void Say() | |
{ | |
cout << word << endl; | |
} | |
}; |
おいおい、private:ってなんだよ!
はい、勝手に増やしてすみません^^;
privateっていうのはクラスの中でしか使えない、という目印です。これでwordを変更できるのはこのクラスの中だけになりました。
~加減乗除の鐘の声~
さあさあ、どんどん便利になってまいりました。
この調子でどんどん便利にしていきましょう。
次はですねー、表示する文字の付け足しでもやってみましょうか。
「醤油とってー。あ、あとマヨネーズも。」
日常ではよくある一言ですね。言った言葉に付け加える。これを実現しましょう。
Say呼んでSetWord呼んでSay呼んで、ハイ終わり。
いやいや、せっかく(ry
足し算をできるようにしましょう!
あらかじめ言わせたい言葉で初期化したクラスを二つ作り、二つの言葉を足して表示できるようにします。
ちょっと自分でも何言ってるのかわからなくなってきたので先にソースを載せましょう。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
string GetWord() | |
{ | |
return this->word; | |
} | |
string Add(ClassClass obj) | |
{ | |
return this->word + obj.GetWord(); | |
} |
これをクラスの中に加えたあとはmain文で
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
ClassClass obj1("oh"),obj2("yeah"); | |
obj1.SetWord(obj1.Add(obj2)); | |
obj1.Say(); | |
_getch(); | |
return 0; | |
} |
これでいいですね。
だがしかし・・・見づらい。
これは気持ち悪い。何とかしましょう。
そもそも足し算したいんだから+が使えると嬉しい。
じゃあ使えばいいんですよ。
クラスにはオペレータという機能があります。
クラスにとっての+とか-の意味を変える機能です。なんと強そうな。
早速使ってみましょう。
static const ってなんですか?(#^p^)
これはクラス間で共有できる定数という意味です。今回は二語を足すとき、間に空白を入れるために使ってみました。
operator+のほうはAddの結果を返してるだけですね。
operator=のほうは戻り値とかが複雑で・・・。まあ、慣れてくれば意味が分かるようになると思うのでここでは「おまじない」ということにしておきます。
あとはmain文のほうですね。
どうですか?だいぶすっきりしたでしょ?
そもそも足し算したいんだから+が使えると嬉しい。
じゃあ使えばいいんですよ。
クラスにはオペレータという機能があります。
クラスにとっての+とか-の意味を変える機能です。なんと強そうな。
早速使ってみましょう。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static const char space=' '; | |
string Add(ClassClass obj) | |
{ | |
return this->word + space + obj.GetWord(); | |
} | |
string operator+(ClassClass obj) | |
{ | |
return Add(obj); | |
} | |
ClassClass& operator=(ClassClass obj) | |
{ | |
SetWord(obj.GetWord()); | |
return *this; | |
} |
これはクラス間で共有できる定数という意味です。今回は二語を足すとき、間に空白を入れるために使ってみました。
operator+のほうはAddの結果を返してるだけですね。
operator=のほうは戻り値とかが複雑で・・・。まあ、慣れてくれば意味が分かるようになると思うのでここでは「おまじない」ということにしておきます。
あとはmain文のほうですね。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
int _tmain(int argc, _TCHAR* argv[]) | |
{ | |
ClassClass obj1("oh"),obj2("yeah"); | |
obj1 = obj1 + obj2; | |
obj1.Say(); | |
_getch(); | |
return 0; | |
} |
~おわり~
今回はこれで終了とします。どうですか?クラスの便利さをわかってもらえましたか?
クラスにはほかにもいろいろな機能があるのですが私自身使いこなせていないので紹介は省きました^^;
もうすこしスキルアップしたらクラスの隠された機能についても触れていこうと思います。
じゃあ、今回はこれで終わり!
今回作ったクラスの中身
今回作ったクラスの中身
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include<iostream> | |
#include<string> | |
using namespace std; | |
class ClassClass | |
{ | |
private: | |
string word; | |
static const char space = ' '; | |
public: | |
ClassClass() | |
{ | |
SetWord(""); | |
} | |
ClassClass(string str) | |
{ | |
SetWord(str); | |
} | |
~ClassClass(){} | |
void Hello() | |
{ | |
cout << "hello world" << endl; | |
} | |
void Hello(int num) | |
{ | |
for (int i = 0; i < num; i++) | |
{ | |
Hello(); | |
} | |
} | |
void SetWord(string str) | |
{ | |
this->word = str; | |
} | |
void Say() | |
{ | |
cout << word << endl; | |
} | |
void Say(int num) | |
{ | |
for (int i = 0; i < num; i++) | |
Say(); | |
} | |
string GetWord() | |
{ | |
return this->word; | |
} | |
string Add(ClassClass obj) | |
{ | |
return this->word + space + obj.GetWord(); | |
} | |
string operator+(ClassClass obj) | |
{ | |
return Add(obj); | |
} | |
ClassClass& operator=(ClassClass obj) | |
{ | |
SetWord(obj.GetWord()); | |
return *this; | |
} | |
}; |
0 件のコメント:
コメントを投稿