クラスクラス(一):クラス
5246 ワード
クラスはデータ構造の拡張概念です.クラス(クラス)はデータと関数を同じ構造に組織する論理方法です.その機能はC言語のstructと似ています.違いはclassが関数を含めてもいいです.structはデータ要素しか含まれません.クラスを定義するキーワードは クラス またはキーワード struct .
クラスクラスクラスname{
access specifieru 1:
メンバーシップ
access specifieru 2:
メンバーシップ
...
)object_name;
その中でもクラスnameはクラス名(ユーザーがカスタマイズしたタイプ)で、object(u)を選択できます.namesはこのクラスの一つまたは複数のオブジェクトの識別です.Classの声明体にはメンバーメンバーmembersが含まれています.メンバーはデータまたは関数定義であってもいいです.また、アクセス引数または許容範囲フラグを含みます.範囲フラグは以下の3つのキーワードのいずれかです.prvate:public:またはprotected:.それぞれ以下の意味を表します.
もし私たちがclassメンバーを定義する時、その許容範囲を宣言しなかったら、これらのメンバーはprvateの範囲として黙認されます.たとえば:
class Rectangle{
int width、height;
public:
void set(int,int)
int ara(void);
}rect;
上記の例では、class Rectangleとこのクラスタイプのオブジェクト変数rectを定義しています.このクラスには4つのメンバーがいます.二つの整数変数(widthとheight)は、prvateの部分にあります.及び二つの関数は、public部分:set_values()とara()は、ここには関数のプロトタイプのみが含まれています.
注意 クラス名とオブジェクト名の違い:上記の例では、Rectanglesはクラス名であり、rectはRectanglesタイプのオブジェクト名である.これらの違いは、次の例のタイプ名intと変数名aの違いと同じです.
int a;
intはclass名(タイプ名)であり、aは対象名object name(変数)である.
プログラムでは、オブジェクト名とメンバー名の間に「.」(dot)をつけることによって、オブジェクトrectのどのpublicメンバーも参照できます.これは一般的な関数や変数だけです.たとえば:
rect.set_values(2,3)
myara=rect.ara();
しかし、私たちはwidthまたはheightを引用することができません.彼らはクラスのprvateのメンバーです.それらはクラスの他のメンバーだけで引用されます.class Rectangleに関する例は以下の通りです.
#include <iostream> using namespace std; class Rectangle { int width, height; public: void set_values (int, int); int area() {return width*height;} }; void Rectangle::set_values (int x, int y) { width = x; height = y; } int main () { Rectangle rect; rect.set_values (3,4); cout << "area: " << rect.area(); return 0; }
area: 12
上のコードの中の新しいものは定義関数set_です.values()の場合に使用する範囲の操作子(ダブルコード:).クラスの外でクラスを定義するためのメンバーです.この関数は非常に簡単なので、Rectangles classの内部で関数ara()の具体的な操作を定義しました.関数セットvalues()は、classの内部ではプロトタイプだけを定義していますが、その実現はクラス以外で定義されています.このクラス以外でそのメンバーを定義する場合は範囲演算子を使用しなければなりません.
範囲演算子(:)は、定義されたメンバーの所属するクラス名を宣言し、定義されたメンバーに適切な範囲属性を付与します.これらの範囲属性は、クラスの内部でメンバの属性を定義するのと同じです.例えば、上記の例では、関数set_にいます.values()の中でprvate変数widthとheightを引用して、これらの変数はclassの内部とそのメンバーの中でだけ見られます.
class内部で直接に完全な関数を定義し、関数のプロトタイプだけを定義して、具体的な実装をクラスの外部に置く唯一の違いは、第一の場合、コンパイラは自動的に関数をinlineとして考慮しますが、第二の場合、関数は一般的なクラスのメンバー関数だけです.挙動は同じであるが,コンパイラ最適化の可能性は異なる.
私たちはwidthとheightをprvateのメンバーと定義しました.これはプログラムの他のところで直接アクセスできないからです.このような簡単な例では、このように2つの変数を保護する意味は見られないかもしれませんが、複雑なプログラムの中では、変数が意外に修正されないようにすることが重要です.
クラスクラスクラスの一番重要な属性はタイプですので、複数の異なるオブジェクトを定義してもいいです.例えば、上記のclass Rectangleの例に続いて、対象rect以外に対象rect bを定義することができます.
#include <iostream> using namespace std; class Rectangle { int width, height; public: void set_values (int, int); int area () {return width*height;} }; void Rectangle::set_values (int x, int y) { width = x; height = y; } int main () { Rectangle rect, rectb; rect.set_values (3,4); rectb.set_values (5,6); cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; return 0; }
rect area: 12 rectb area: 30
注意:呼び出し関数rect.ara()は、rectb.ara()を呼び出して得られた結果とは異なります.これは各class Rectangleの対象が自分の変数widthとheightを持っているからです.そして、自分の関数set_.values()とara()です.
これはオブジェクトとオブジェクト指向プログラミングの概念に基づいています.この概念では、データと関数はオブジェクトの属性であり、以前のように構造プログラミングではなく、関数パラメータである.私たちは今後の内容で、対象に向けたメリットをゆっくりと議論します.
この具体的な例では、私たちが討論しているクラスはRectanglesで、二つのインスタンスがあります.あるいはオブジェクト(object):rectとrectbで、それぞれはそのメンバー変数とメンバー関数があります.