C ++入門:第7章まとめ
第7章クラス
7.1抽象データ型を定義します
クラスの基本的な考え方:データの抽象化、カプセル化。
データ抽象化:インターフェースとプログラミングの実装と設計技術の分離に依存しています。実行可能な操作を含むユーザインタフェースとデータ・クラス・メンバーのためには、プライベート体とクラスインターフェースの機能の定義に必要な各種の機能を担う含みます。
インタフェースと実装の分離パッケージの実装クラス。クラスのパッケージを隠す実装の詳細は、ユーザーがいくつかにアクセスすることができません達成するためのインターフェースを使用することができます。
- Userクラスは、アプリケーションではなく、エンドユーザーのプログラマーです。
- クラスが実装クラスを検討するデザイナー、クラスは使いやすく、ユーザーインターフェースクラスクラスの使用のみにかかわらず、クラスの実装機構の。
メンバ関数の紹介
- 非メンバ関数宣言のみ外部クラス定義、メンバ関数は、クラス内、クラスまたはクラスを定義することができる外部宣言することができます。
- クラスインライン関数内で定義されたメンバ関数は、暗黙的です。
このの紹介
- これは、暗黙のパラメータであり、それ自体は一定のポインタである関数が呼び出されたオブジェクトを指します。
- このパラメータは、暗黙のうちに、これは違法であるという名前のカスタムパラメータまたは変数を定義しています。
//this的类型:Sales_data * const
total.isbn(); // this=&total;
constメンバ関数の導入
- constメンバ関数で、これはそれ自体、それが参照するポインタは一定です。
- 定数オブジェクト、および一定の参照とポインタのオブジェクトはconstメンバ関数を呼び出すことができ、通常のオブジェクトは、通常のメンバ関数およびconstメンバ関数を呼び出すことができます。
- ためのconstメンバ関数、定数オブジェクトを呼び出すことができ、この定数をポイントし、constオブジェクト、機能、柔軟性とよりよい。ための通常のメンバー関数は、この非常にポイント量、量は非常に被写体と呼ぶことができます。
// f:成员函数
// 第1个const:返回值是常量
// 第2个const:形参是常量
// 第3个const:函数是常量成员函数
const int A::f(const int ci) const
{
return ci;
}
このオブジェクトを返す関数を定義します
A& A::f(A& a)
{
.....
return *this; // 返回调用该函数的对象
}
a1.f(a2); // 返回对a1的引用
非メンバ関数の関連するクラスの定義
- 関数の宣言と定義を別々に格納します。ヘッダファイルとクラス宣言の同じ一般的な関数宣言の非メンバー。
- 同じクラスに属するアレイIOタイプをコピーしないで、それは参照によって渡すことができます。
- 出力機能を行うタスクは、一般に、ユーザによって追加された改行などのフォーマットを制御するために低減されなければなりません。
コンストラクタ
- コンストラクタクラス名と同じ、非復帰型の名前は、クラスオブジェクトのデータメンバを初期化するために、constのように宣言することはできません。
- (引数なし)デフォルトのコンストラクタ;合成のデフォルトコンストラクタ(コンパイラによって作成されたコンストラクタ)。
- 合成デフォルトコンストラクタは非常に単純なクラスにのみ適している、一般的なクラスは、デフォルトコンストラクタを定義する必要があります。なぜなら、任意のクラスのコンストラクタ関数が宣言されていない場合にのみ、コンパイラは、コンストラクタが合成されているデフォルトであろう;内蔵または化合物タイプ(アレイ、ポインタ)データメンバ未定義のデフォルトの初期化され、クラスタイプのクラスの他のメンバーを含みますデフォルトのコンストラクタを持っていないし、クラス型は、コンパイラがデフォルトコンストラクタを合成することができません。
- リスト初期化子コンストラクタ。
コピークラスの割り当てとデストラクタ
- コンパイラは、コピー、譲渡及び破壊操作を合成することができます。しかし割当リソース・クラス以外のオブジェクトクラス(例えば、動的メモリ管理)、障害のしばしば合成バージョンを必要とします。
- 使用ベクトルや文字列は、メモリの割り当てと解放の複雑さを避けることができます。
7.2 Access Controlパッケージ
アクセス指定:パブリック、プライベート
- メンバ関数のためのインターフェースが表示されている器具を封入するためのプライベート、可視オブジェクトのクラスとメンバ関数のパブリックインターフェイスを定義するために使用されます。
- 構造体のデフォルトのアクセスが公開されて、クラスのデフォルトのアクセス権限は、プライベートです。すべてのクラスのメンバーは、構造体を使用して、公開された場合は、プライベートレッスン、使用クラスがある場合。
友達:クラス自体のアクセス非パブリックメンバーに他のクラスや関数をしてみましょう
- フレンド宣言のみ指定ではなく、通常の関数宣言の、のみアクセスすることをクラスに現れることができ、それは省略することができない関数宣言です。
- クラス定義や宣言で最高のスタートは、友人の終了前に位置を集中しました。
7.3のようなその他の機能
クラスのメンバー:メンバー型、インラインメンバ関数、オーバーロードされたメンバ関数、変数のデータメンバー(可変)、クラス・データ・メンバーは、初期化
- 通常のメンバーの定義および使用は順番することはできませんが、メンバーが最初の再利用のタイプを定義する必要があります。タイプのメンバーは通常、開始する場所の種類で発見され、通常使用のtypedefを使用しています。
- クラス宣言でコンストラクタのいずれかの場合に必要なデフォルトコンストラクタを明示的に宣言されなければならない場合、コンパイラはデフォルトコンストラクタは、合成されなくなります。
- メンバ関数暗黙的にインライン明示的なインライン型の外側継手。
- 共通の分離関数宣言と定義、ヘッダーファイル内の関数宣言、ソースファイルに同じ名前の関数を定義します。例外:インライン関数、ヘッダファイルに定義されconstexprの関数やクラス。
- オブジェクトCONST変数データ・メンバーに対して、constメンバ関数は変更可能です。
- クラスの初期値は、等号または括弧で表されます。
*このメンバ関数を返します。
- 戻り型が基準である場合、オブジェクト自体を返し、戻り値の型が参照されていない場合はリターン*この機能のために、この関数はオブジェクトのコピーを返します。
- constメンバ関数は、参照として本*を返し、その戻り型は、一定の基準です。
- パラメータはCONSTであるかどうかに応じて、constメンバ関数がオーバーロードされた関数かどうかを決定しました。
class A
{
A &f1(int x) // 返回*this
{
return *this;
}
A &f2(const int x) // 形参是const
{
return *this;
}
A &f3(int x) const; // 成员函数是const
{
return *this;
}
};
クラスタイプ
- リストのクラスタイプとクラスのメンバーは何の関係もありません。両方のクラスについては、さえメンバーの同じリストならば、彼らはまた、さまざまな種類があります。
- フォワード宣言:一時的にのみクラス宣言クラスを定義していない場合、クラスは不完全型です。唯一の不完全型は、基準点、又はポインタ、不完全型宣言パラメータまたは関数の戻り値のタイプを定義するために使用されます。
- 唯一考えクラスが定義されているすべてのクラスの完了ので、クラス宣言のデータメンバーは、クラスが完全に指定されていない場合、唯一のクラス宣言点又はポインタ型を参照した後、型を宣言することはできません。オブジェクトまたはメンバーのクラスを作成するには、クラス定義の後にクラスにアクセスします。
友達再訪
- クラスのメンバ関数やクラス自体は友人として使用することができます。
- 指定されたクラスのフレンドクラスは、メタクラスのメンバ関数の友人は、このクラスのすべてのメンバーがアクセスすることができます。
- 友情は推移ではありません。各クラスには、彼らの友人のクラスと友人の機能を制御する唯一の責任です。
- 友人、友人の宣言と、各機能でオーバーロード関数の必要性などの機能をオーバーロードしている場合。
- フレンド宣言はアクセスだけではなく、本当の声明に影響を与えます。フレンド関数のクラスの宣言と使用になる前に、最高の最初の本当のステートメント。
7.4クラススコープ
- クラスは、スコープです。オブジェクトの範囲、およびポインタ参照メンバ選択演算子外部 - データメンバーとスコープオペレータによってアクセスクラスのメンバ関数((及び>):アクセス:)クラス型部材。
- スコープパラメータリストとクラスのクラス名の後に関数本体。
- 名前検索(ステートメント名でベストマッチを見つけるプロセス)は、通常、内側から、最初の囲みスコープで見て、その後、前のブロックで使用されるコード名を検索。
- あなたがクラスを定義する場合、コンパイラはファーストクラスコンパイルされた関数本体の後にすべての可視まで、メンバーの宣言をコンパイルします。
- 再定義囲むクラスのドメイン名の種類を表しているわけではありません。
- クラスのメンバ関数のメンバーの名前をパラメータとして使用することはお勧めしません。
- メンバ関数の本体内の名前の検索機能は、体内のとの最初の関数ならば、元の使用の名前コードの検索は、そのクラス、そして最後に見て、元のメンバ関数定義のドメインルックアップ機能。
7.5コンストラクタ再訪
コンストラクタの初期化リスト
- コンストラクタは、初期値をお勧めします。初期化と割り当てとの間の差は、割り当てによって初期化され、前者の直接初期化データメンバの基本効率に関連しています。特に、メンバーはCONST、参照、またはデフォルトのコンストラクタを提供されない特定のクラスタイプに属している場合、初期値は、コンストラクタの初期化リストによって提供されなければなりません。
- コンストラクタ初期化リストは、初期化シーケンスのメンバーによって定義された順序で実行される初期化メンバーの値を示しています。最高のコンストラクタを作るためのメンバーと一致して初期化し、他のメンバーの特定のメンバーの使用を避けるために、初期値を宣言しました。
- すべてのコンストラクタの引数はデフォルト引数のコンストラクタを提供する場合は、デフォルトのコンストラクタです。
委託コンストラクタ
- それは、クラスのコンストラクタに属する他の委託コンストラクタが使用する独自の初期化処理を行う、または一部(または全部)を所有するためにそれを任せる他のコンストラクタへの責任。
#include <iostream>
#include <string>
using namespace std;
std::istream &read(std::istream &is, Sales_data &item);
class Sales_data
{
public:
Sales_data(string s, unsigned cnt, double rev) : bookNo(s), units_sold(cnt), revenue(cnt * rev) {}
Sales_data() : Sales_data("", 0, 0) {}
Sales_data(string s) : Sales_data(s, 0, 0) {}
Sales_data(std::istream &is) : Sales_data()
{
read(is, *this);
}
private:
string bookNo;
unsigned units_sold = 0;
double revenue = 0.0;
friend std::istream &read(std::istream &is, Sales_data &item);
};
std::istream &read(std::istream &is, Sales_data &item)
{
int price;
is >> item.bookNo >> item.units_sold >> price;
item.revenue = item.units_sold * price;
return is;
}
int main()
return 0;
}
デフォルトコンストラクタの役割
- オブジェクトが初期化され、デフォルト値であるか、または初期化が自動的にデフォルトコンストラクタを行った場合。
- デフォルト初期化状況が発生する:任意スコープなしの初期値は、非静的変数またはアレイのブロックで定義され、クラス自体は、クラスタイプと合成デフォルトコンストラクタのメンバーを含む、クラス型の最初のメンバーは、値コンストラクタのリストにありません明示的に初期化。
- 発生の値に初期化:アレイの初期化の数が少ないアレイサイズよりときに初期値を提供するステップと、初期値は、ローカル静的変数を定義するために使用されていない、フォームTの表現を書き込む()を明示的に要求された値が初期化されます。
- 他のコンストラクタを定義する場合、デフォルトコンストラクタを提供することが望ましいです。
- A()は、関数宣言、aは、Aクラス・オブジェクトが作成されます。
クラスの暗黙の型変換。
- 変換コンストラクタ:コンストラクタ関数が受け入れる場合、引数を、それは暗黙的に入力し、このようなパラメータに変換することができます。
- コンパイラは、のみ行うことができます一歩クラスの型変換のを。
- 明示的に定義された暗黙的な変換コンストラクタを抑制しました。明示的な唯一のコンストラクタ引数は、コンストラクタの引数は、暗黙的な変換の複数を含有しない、有効です。ただ、クラス外で定義されるように繰り返されていない、クラスのコンストラクタで明示的なステートメントを使用し、明示的なコンストラクタを使用することができますむしろ、コピーの初期化よりも、直接初期化は、;明示的なコンストラクタキャストに表示することができます。
- 単一のパラメータのconstのcharを受け入れ*文字列のコンストラクタ関数が明示的ではない、と能力パラメータベクトルのコンストラクタを明示的である受け入れます。
- 一時変数を変更できない暗黙的型変換の種類は、のみ一定の基準に伝達され、一定と見なすことができ、非const参照(一時変数の値のみを用いて初期化され、右側、左const参照値である)に伝達されません。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
//非explicit构造函数
const char c = 'a';
const char *p = &c;
string s1(p);
string s2 = (p);
//explicit构造函数
// vector<int> v1 = (10);
vector<int> v1(10);//explicit构造函数只能直接初始化
return 0;
}
クラス重合
- 集計クラスの条件を満たす:すべてのメンバーが公開され、任意のコンストラクタを定義しない;ないクラス内の初期化子;無基底クラスと仮想関数。
- 中括弧の初期化で囲まれた利用できる集約クラス値の初期メンバーリスト。
例:
#include <iostream>
using namespace std;
struct Sales_data
{
string bookNo;
unsigned units_sold; //聚合类无类内初始值
double revenue;
};
int main()
{
Sales_data item = {"978-0590353403", 25, 15.99};
return 0;
}
リテラルクラス
- データメンバは、ポリマーカテゴリのリテラルの型は、クラスリテラルに属します。
- 他の種類のリテラル条件:メンバーがリテラルデータ型であり、クラスは初期値のデータメンバが含まれている場合、内蔵型部材の初期値は、一定の式でなければならない、または、constexprのクラスは、少なくとも1つのコンストラクタを含める必要がありますメンバーは、特定のクラス型に属している場合は、メンバーの初期値は、それ自体が使用されるコンストラクタをconstexprのでなければなりません。このクラスは、デフォルトデストラクタは、オブジェクトクラスの破壊を担当するメンバーを定義する必要があります。
- 空constexprのコンストラクタ関数の本体は、一般的に、すべてのデータメンバは、初期値やconstexprのコンストラクタ、または定数式を初期化する必要がありますされています。
class Debug
{
public:
constexpr Debug(bool b = true) : hw(b), io(b), other(b){};
constexpr Debug(bool h, bool i, bool o) : hw(h), io(i), other(o){};
constexpr bool any()
{
return hw | io | other;
}
void set_io(bool b)
{
io = b;
}
void set_hw(bool b)
{
hw = b;
}
void set_other(bool b)
{
other = b;
}
private:
bool hw;
bool io;
bool other;
};
7.6静的クラスメンバー
- クラスに関連するクラスの静的メンバーにかかわらず、オブジェクトクラスの。
- 静的メンバは、パブリックまたはプライベートすることができ、一定の、参照、ポインタ、クラスタイプにすることができます。これは、このポインタは、constメンバ関数を宣言することはできません何もありません。
- 静的メンバは、クラス内の静的、スコープ演算子と訪問を宣言しています。メンバ関数は静的メンバに直接アクセスすることができます。
- クラスまたはクラス内の静的メンバ関数外部定義されてもよい(クラス外で定義は、静的場合複製することができない)、静的データメンバーがなければならないクラス定義と初期化の外側、及び一度だけ定義して初期化することができます。
- 静的のconst int型のクラスメンバは、初期値を備えることができる。静的constexprのがなければならないクラスの初期値を備え。
- コンパイラは、静的メンバの値を置き換えることが、静的定数constexprの静的または定義されない場合があり、そうでない場合は、静的メンバー定義文がなければなりません。
- 静的メンバは、デフォルト引数、非静的データメンバを行うことができ、静的メンバ、参照とポインタは不完全型(クラス宣言のみを一時的に未定義クラス)、クラスは、不完全な型を除いて、唯一の一般的なメンバーを定義した後にアクセス可能とすることができますないデフォルトの引数として。