クラスclass(一)
最も簡単に言えば、クラスは新しいタイプと新しい役割ドメインを定義します.
各クラスにはメンバーがなくてもよいし、複数のメンバーを定義してもよい.メンバーはデータ、関数、またはタイプ別名であってもよい.
1つのクラスには、いくつかの共有、プライベート、および保護された部分が含まれます.
クラスタイプのオブジェクトを作成すると、コンパイラは自動的にコンストラクション関数を使用してオブジェクトを初期化します.
コンストラクション関数は、通常、オブジェクトのデータ・メンバーを初期化するためにコンストラクション関数初期化リストを使用します.
クラス内では、メンバー関数を宣言する必要がありますが、メンバー関数を定義するにはオプションで、クラス内で定義された関数はデフォルトでinlineです.
クラスの外部で定義されたメンバー関数は、クラスの役割ドメインにあることを示す必要があります.
メンバー関数には、呼び出し関数のオブジェクトに関数をバインドする追加の隠し実パラメータがあります.
キーワードconstをパラメータテーブルに追加すると、メンバー関数を定数として宣言できます.
constメンバーは、操作するオブジェクトのデータメンバーを変更することはできません.constは、宣言と定義に同時に表示される必要があります.
コンパイル中にエラーが発生しました
C++では、クラスの抽象インタフェースと実装パッケージを定義するためにアクセスタグを使用します.
プログラムのすべての部分はpublicラベルのあるメンバーにアクセスできます.タイプのデータ抽象ビューは、publicメンバーによって定義されます.クラスのコードを使用してprivateラベルのあるメンバーにアクセスできません.privateはタイプの実装の詳細をカプセル化しています
任意のアクセス番号が表示される前にクラスメンバーを定義できます.クラスがstructキーで定義されている場合は、最初のアクセス番号の
前のメンバーは公有です.クラスがclassキーで定義されている場合、これらのメンバーはプライベートです.
データと関数メンバーの定義に加えて、クラスは独自のローカルタイプ名を定義できます.
クラスで定義されたタイプ名は、他のメンバーの標準的なアクセス制御に従います.
メンバー関数は再ロードできます.このクラスの他のメンバー関数のみを再ロードできます.
クラス内で定義されたメンバー関数は、自動的にinlineとして処理されます.
メンバー関数をinlineとして明示的に宣言できます
クラス定義ボディの内部にinlineというメンバーを指定して、その宣言の一部として使用するか、クラス定義外部の関数定義で指定できます.
定inline、宣言と定義で指定するinlineはすべて合法的です
他のinlineのように、inlineメンバー関数の定義は、その関数を呼び出す各ソースファイルで表示され、クラス定義ではありません.
クラス定義のある同じヘッダファイルに通常配置されるinlineメンバー関数
1つの指定されたソースファイルでは、1つのクラスは1回しか定義できません.複数のファイルで1つのクラスを定義する場合、各ファイルの定義
まったく同じでなければならない
クラスを定義せずに宣言できます:class Screen;//declaration of the Screen classという宣言は、フォワード宣言(forward declaraton)と呼ばれることがあります.クラスのフォワード宣言は、一般的に相互依存クラスを記述するために使用されます.
不完全タイプ(incomplete type)は限られた方法でのみ使用できます.このタイプのオブジェクトは定義できません.不完全タイプは定義にのみ使用できます.
このタイプへのポインタおよび参照、または定義ではなく宣言に使用するパラメータタイプまたは戻りタイプの関数として使用します.
クラスのオブジェクトを作成する前に、クラスを完全に定義する必要があります.
クラスに独自のタイプのデータ・メンバーは存在しません
クラスのデータ・メンバーは、独自のタイプへのポインタまたは参照です.
クラス定義が前に表示されている場合にのみ、データ・メンバーがクラス・タイプとして指定されます.このタイプが不完全なタイプである場合、データ
メンバーは、クラスタイプへのポインタまたは参照のみです.
オブジェクトを定義すると、ストレージスペースが割り当てられますが、(一般的に)タイプを定義するときはストレージ割り当ては行われません.
クラスタイプを定義すると、次の2つの方法で使用できます.1.クラスの名前を直接タイプ名2として使用します.キーワードclassまたはstructを指定し、後でクラスの名前を付けます.
クラス定義のセミコロンは終了します.セミコロンは必要です.クラス定義後にオブジェクト定義リストを受け取ることができるからです.
通常、オブジェクトをクラス定義の一部として定義するのは悪い考えです.
各クラスにはメンバーがなくてもよいし、複数のメンバーを定義してもよい.メンバーはデータ、関数、またはタイプ別名であってもよい.
1つのクラスには、いくつかの共有、プライベート、および保護された部分が含まれます.
クラスタイプのオブジェクトを作成すると、コンパイラは自動的にコンストラクション関数を使用してオブジェクトを初期化します.
コンストラクション関数は、通常、オブジェクトのデータ・メンバーを初期化するためにコンストラクション関数初期化リストを使用します.
クラス内では、メンバー関数を宣言する必要がありますが、メンバー関数を定義するにはオプションで、クラス内で定義された関数はデフォルトでinlineです.
クラスの外部で定義されたメンバー関数は、クラスの役割ドメインにあることを示す必要があります.
メンバー関数には、呼び出し関数のオブジェクトに関数をバインドする追加の隠し実パラメータがあります.
キーワードconstをパラメータテーブルに追加すると、メンバー関数を定数として宣言できます.
constメンバーは、操作するオブジェクトのデータメンバーを変更することはできません.constは、宣言と定義に同時に表示される必要があります.
コンパイル中にエラーが発生しました
C++では、クラスの抽象インタフェースと実装パッケージを定義するためにアクセスタグを使用します.
プログラムのすべての部分はpublicラベルのあるメンバーにアクセスできます.タイプのデータ抽象ビューは、publicメンバーによって定義されます.クラスのコードを使用してprivateラベルのあるメンバーにアクセスできません.privateはタイプの実装の詳細をカプセル化しています
任意のアクセス番号が表示される前にクラスメンバーを定義できます.クラスがstructキーで定義されている場合は、最初のアクセス番号の
前のメンバーは公有です.クラスがclassキーで定義されている場合、これらのメンバーはプライベートです.
データと関数メンバーの定義に加えて、クラスは独自のローカルタイプ名を定義できます.
クラスで定義されたタイプ名は、他のメンバーの標準的なアクセス制御に従います.
メンバー関数は再ロードできます.このクラスの他のメンバー関数のみを再ロードできます.
クラス内で定義されたメンバー関数は、自動的にinlineとして処理されます.
メンバー関数をinlineとして明示的に宣言できます
クラス定義ボディの内部にinlineというメンバーを指定して、その宣言の一部として使用するか、クラス定義外部の関数定義で指定できます.
定inline、宣言と定義で指定するinlineはすべて合法的です
他のinlineのように、inlineメンバー関数の定義は、その関数を呼び出す各ソースファイルで表示され、クラス定義ではありません.
クラス定義のある同じヘッダファイルに通常配置されるinlineメンバー関数
1つの指定されたソースファイルでは、1つのクラスは1回しか定義できません.複数のファイルで1つのクラスを定義する場合、各ファイルの定義
まったく同じでなければならない
クラスを定義せずに宣言できます:class Screen;//declaration of the Screen classという宣言は、フォワード宣言(forward declaraton)と呼ばれることがあります.クラスのフォワード宣言は、一般的に相互依存クラスを記述するために使用されます.
不完全タイプ(incomplete type)は限られた方法でのみ使用できます.このタイプのオブジェクトは定義できません.不完全タイプは定義にのみ使用できます.
このタイプへのポインタおよび参照、または定義ではなく宣言に使用するパラメータタイプまたは戻りタイプの関数として使用します.
クラスのオブジェクトを作成する前に、クラスを完全に定義する必要があります.
クラスに独自のタイプのデータ・メンバーは存在しません
クラスのデータ・メンバーは、独自のタイプへのポインタまたは参照です.
クラス定義が前に表示されている場合にのみ、データ・メンバーがクラス・タイプとして指定されます.このタイプが不完全なタイプである場合、データ
メンバーは、クラスタイプへのポインタまたは参照のみです.
オブジェクトを定義すると、ストレージスペースが割り当てられますが、(一般的に)タイプを定義するときはストレージ割り当ては行われません.
クラスタイプを定義すると、次の2つの方法で使用できます.1.クラスの名前を直接タイプ名2として使用します.キーワードclassまたはstructを指定し、後でクラスの名前を付けます.
クラス定義のセミコロンは終了します.セミコロンは必要です.クラス定義後にオブジェクト定義リストを受け取ることができるからです.
通常、オブジェクトをクラス定義の一部として定義するのは悪い考えです.
#include <string>
#include <iostream>
using namespace std;
class Screen {
public:
typedef string::size_type index;
// implicitly inline when defined inside the class declaration
char get() const { return contents[cursor]; }
// explicitly declared as inline; will be defined outside the class declaration
inline char get(index ht, index wd) const;
// inline not specified in class declaration, but can be defined inline later
index get_cursor() const;
// constructor with height and width
Screen():height(0),width(0){}
Screen(index h,index w):height(h),width(w) {
cout << height << width << endl;
}
private:
string contents;
index cursor;
index height, width;
};
// inline declared in the class declaration; no need to repeat on the definition
char Screen::get(index r, index c) const
{
index row = r * width; // compute the row location
return contents[row + c]; // offset by c to fetch specified character
}
// not declared as inline in the class declaration, but ok to make inline in definition
inline Screen::index Screen::get_cursor() const
{
return cursor;
}
class LinkScreen {
Screen window;
LinkScreen *next;
LinkScreen *prev;
};
class Y; //forward declaraton
class X{
//Y y error!
Y* y;
};
class Y{
X x;
};
int main()
{
Screen s1;
class Screen s2; // inherited from C and is also valid in C++
struct Screen s3; // inherited from C and is also valid in C++
return 0;
}