最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

C/C++ クラス(Class)


クラスとは?

 C言語には、クラスは無いが、構造体がある。C++ のクラス(Class) は、C言語の構造体へ関数を含めることが出来る特殊な構造体と見ることも出来る。

 vb2005 とか java 等ではフツー(何気なく)に出てくる言葉なので、意識せずに使っている場合も多々あるかもしれない。現在の高級言語では、プロシージャを取り巻く wrapper として必ず(といっても?)この言葉にお目に掛かるが、意識したことはなかった。(意識しなくても困らなかった...?)

 C++ で Class を使用する場合、相当意識する必要があるようなので注意。

C++ のクラス

 実際には、C言語構造体を拡張した物、又は、C++ においての構造体は Class の機能を制限したような使い方(ちょっと違うが...)といえる。

※内容非保証:Operater Overload で必要に迫られた最低限の Class の覚え書きである。

コンストラクタ・デストラクタ

 クラスを使いこなすには、コンストラクタとデストラクタの知識も必要となるが今回はそこまで必要としないと思うので取り合えず割愛。

※動的配列(new delete)をクラス内で使用する場合必須。
※メモリを確保(インスタンス生成)したなら、開放が必須。コンストラクタ、デストラクタはこれらを自動で行ってくれるもの...と言うことになる。
※自動と言っても win32 で garbage collection が動く訳もない。領域を確保したプロシージャ消滅に合せ開放をおこなうと言うことである。
※STL は、テンプレートを多用した「クラス」とよく言われ、クラスを極めれば、STL のより深い理解が可能になると思う。クラス内で STL を使う分には、STL 側がやってくれる(...と思う...)ので多分気にしなくて良い。(※非保証)

コンストラクタ、デストラクタ
※new, delete など、動的メモリ確保時に必須。その他の場合必ずしも必須ではない。
class Meibo {
   int age; string name;    // age=15 or age(15) 等 err
public:
   // コンストラクタ・デストラクタ
   Meibo();                 // コンストラクタ(初期化)
   Meibo(const Meibo &);    // コピーコンストラクタ(初期化)
   ~Meibo();                // デストラクタ(終了処理)
   // その他のメンバ関数
   void SetData(int, string);
   void ShowData();
};
void main() {
   Meibo MyClass;              // コンストラクタ呼出 
   // MyClass.SetData(13,"Kinomoto Sakura");
   MyClass.ShowData();
   Meibo MyClass2 = MyClass;   // コピーコンストラクタ呼出
   MyClass2.ShowData();
}                              // デストラクタ実行

Meibo::Meibo() {               // 初期化定義:初期化子、初期化リスト
   cout << "コンストラクタ実行" << endl;
   age = 12; name = "non";     // 別に空 {} でも良い
}
Meibo::Meibo(const Meibo& obj) {
   cout << "コピーコンストラクタ実行" << endl;
   age = 10; name = "No Name"; // 空なら不定値で初期化?
}
Meibo::~Meibo() {              // 終了処理を記述
   cout << "デストラクタ実行" << endl;  
}
void Meibo::SetData(int in_age, string in_name) {
   age = in_age; name = in_name;
}
void Meibo::ShowData() {
   cout << age  << "" << name << endl;
}
※このようにすると、初期化された値、12 non が表示される。
※無くても自動で補完されるが、入れておく癖をつけておくと後で理解がしやすいかも?(多分)
※My は VB の便利機能に 同名キーワードがあった気がする...が、全く関連なく使った名称。
※ちなみに、コンストラクタを使わずクラスの private 変数へ直接初期値を設定 (int age = 15; とか) するとコンパイルエラーが出る。

表示サンプル
コンストラクタ実行        // MyClass のコンストラクタ
12 non
コピーコンストラクタ実行   // MyClass2 のコピーコンストラクタ
10 No Name
デストラクタ実行          // 多分 MyClass2 のデストラクタ
デストラクタ実行          // 多分 MyClass のデストラクタ
続行するには何かキーを押してください . . .

▲上へ [ 編集 ]

クラスをオブジェクトとして使う

 クラスの特徴として内部変数などを隠蔽する機能がある。要するにブラックボックスのような一連の機能を持った関数(Class)を作ることが出来る。

 例えば時計(Class)は、〇を刻む、¬楹个泙靴鬟札奪箸垢襦↓L楹个泙靴鳴る、ぬ楹个泙靴鮖澆瓩襦↓セ間を修正する... と言った機能をオブジェクト(時計Class)に持たせ、外部から◆↓ぁ↓イ里茲Δ柄犧遒出来(オブジェクト操作)て、内部では ↓の様な機能が働いている...ということをプログラムするのに適しているのが、クラスと呼ばれるもの。一般的にオブジェクト指向と呼ばれる。

 さらに、内部的な操作は準備済みのボタン(関数呼出)で行うこととすることで、再利用やセキュリティの向上などを確保している。(カプセル化)

 故に、めんどくさい手続きと難解な知識を必要をされる。

次に簡単な Class の使用例
※Class 内へ メンバ関数を持たせた例。
#include <iostream>
#include <string>
using namespace std;
class Meibo {
private:
   int    age;
   string name;
public:
   void SetData(int in_age, string in_name) {
      age  = in_age;
      name = in_name;
   }
   void ShowData() {
      cout << age  << endl;
      cout << name << endl;
   }
} My;
void main() {
   My.SetData(13, "Kinomoto Sakura");
   My.ShowData();
}
※関数をメンバへ含め外部から private: 内の操作を可能とする。
※main からは、公開された既定のメンバ関数のみ呼出が可能。

メンバ関数を外部へ置く場合
class Meibo {
   int    age;
   string name;
public:
   void SetMeibo(int, string);
   void Show();
};
void main() {
   Meibo MyClass;
   MyClass.SetMeibo(13,"Kinomoto Sakura");
   MyClass.Show();
}
void Meibo::SetMeibo(int in_age, string in_name) {
   age  = in_age;
   name = in_name;
}
void Meibo::Show() {
   cout << age  << endl;
   cout << name << endl;
}
※メンバ関数は、外部定義した関数の利用も出来る。
※例によって色々な記述が可能だが、通常はこの形式が多い。

▲上へ [ 編集 ]

クラスを構造体として使う

 構造体(struct)の使用を止めて、Class で以下の様にフツーに使用可能。

最も簡単な Class の使用例
※単に struct を class へ置き換えて使用。
#include <iostream>
#include <string>
using namespace std;
class Meibo {
public:        // 必須 無なら既定で private: となる。
   int    age;
   string name;
} My;
void main() {
   My.age  = 13;
   My.name = "Kinomoto Sakura";
   cout << My.age  << endl;
   cout << My.name << endl;
}
※Struct が Class に置き換わっているだけで構造体と同様に動く。
※要注意:この場合 public: 必須。ここが struct と大きく異なる。
※struct class の一部相違点のみ把握していれば、こうしたことが可能である。
※public: 指定しない場合、class 外部より構造体変数が隠蔽される。(アクセス不可)

▲上へ [ 編集 ]

リンク


内部リンク

^ [[C/C++ クラス(Class)]]

外部リンク


  • 現在ありません

▲上へ [ 編集 ]
2008年07月08日(火) 00:12:38 Modified by cafeboy1




スマートフォン版で見る

×

この広告は60日間更新がないwikiに表示されております。