カプセル化
1. オブジェクトのアクセス権
デフォルトのアクセス権
1. struct はデフォルトで public です
2.クラスはデフォルトではプライベートです
2. コンストラクターとデストラクター
コンストラクター: 初期化呼び出し
クラス名 {
}
デストラクター: 関数が破棄されるときに呼び出されます。
~クラス名{
}
3. コンストラクターの分類と呼び出し
1.コンストラクタ関数の分類
-1.パラメータ
パラメータを含む構造体
引数なしの構築
-2.タイプ
通常の構造
コピー構築: 同じタイプのオブジェクトを渡し、このオブジェクトの値を既存のオブジェクトにコピーする必要があります。
2.コンストラクター呼び出し
-1.ブラケット法
人物 p1;
人物 p2(10);
人物 p3(p2);
注: デフォルトの構造に () を追加しないでください。システムはそれがステートメントであると認識します。
人 p1();
-2.表示方法
人物 p1;
人 p2=人(10);
人 p3=人(p2);
匿名オブジェクト
人(10);
注: 匿名オブジェクトを初期化するためにコピー コンストラクターを使用しないでください。システムはそれが Person(p3)===Person p3 であると認識します。
人(p3);
3. 暗黙的な変換方法
人 p4=10; //人 p4=人(10) と同等
4. コンストラクター呼び出しシナリオ
1. 既存のオブジェクトを使用して新しいオブジェクトを初期化します。
人 p3=人(p2);
2. 値転送を使用して関数パラメータに値を渡します。
doWork(人 p);
3. ローカルオブジェクトを値で返します
人 doWork(){
人物 p1;
p1 を返します。
}
5. コンストラクター呼び出し規則
1.デフォルト機能
デフォルトのコンストラクター
デフォルトのデストラクタ
デフォルトのコピー機能
2. ユーザー定義のパラメーター化されたコンストラクターの場合、C++ はデフォルトのパラメーターなしコンストラクターを提供しませんが、デフォルトのコピー コンストラクターを提供します。
3. ユーザー定義のコピー コンストラクター。C++ は他のコンストラクターを提供しません。
6. ディープコピーとシャローコピー
1. 浅いコピー
簡単なコピー操作
2.ディープコピー
スペースを引き換えて再申請する場合は、コピー操作を実行します。
7. リストのプロパティを初期化します (コンストラクターの代わりに)
人物():m_A(10)、m_B(20)、m_C(30)
に相当
人(int a,int b,int c){
this.a=a;
これ.b=b;
これ.c=c;
}
人(a、b、c);
8. クラスオブジェクトがクラスメンバーになる
1. クラスを別のクラスの属性として作成する
クラス A{}
クラスB{
ああ、
}
2. シーケンス
作成した
B作成
B破壊する
A破壊する
9. 静的メンバー
1.コンセプト
静的メンバーは、プロパティまたは関数の前に static を追加します。
2.特長
-静的メンバー変数
-- すべてのオブジェクトが同じデータを共有します
-- コンパイル段階でメモリを割り当てます。
-- クラス内で宣言、クラス外で初期化
-静的メンバー関数
-- すべてのオブジェクトは同じ機能を共有します
-- 静的メンバー関数は静的メンバー変数にのみアクセスできます。
10. メモリ管理とこれ
1. クラス内のメンバー変数とメンバー関数は別々に保存されます
非静的メンバー変数のみがクラスのオブジェクトに属します
2.本件の目的
-1. オブジェクト空間では、非静的変数には複数のインスタンス化されたオブジェクトがあるため
これを使用して、呼び出されたメンバー関数が属するオブジェクトをポイントします。
-2.これはポインタです。 *これは p2 のオブジェクト本体を指します
11. NULL ポインターを使用したメンバー関数の呼び出し
クラス人
{
公共:
void showage(){
cout<<""<<m_age;
}
int m_age;
}
void テスト(){
人 *p=NULL;
p->showage();
}
12.const モンクメンバー関数
定数関数:
void showperson() const{
}
const Person*this と同等
左に数えて右を指す
これは定数ポインターであり、指す値は変更できないことを規定しています。
1. メンバー関数に const を追加した後、この関数を定数関数と呼びます。
2. 定数関数内ではメンバ属性を変更できません。
これの本質は、ポインタ定数です。ポインタの指す値は変更できませんが、指す値は変更できます。
3. メンバー属性が false キーワード mutable で宣言された後でも、定数関数内で変更できます。
共通オブジェクト:
1. オブジェクトを宣言する前に const を追加して、オブジェクトを定数オブジェクトにします。
2. 定数オブジェクトは定数関数のみを呼び出すことができます
13.ヨウユアン
プライベート変数へのアクセスを実装する
1. グローバルは友達として機能する
#include <iostream>
#include<文字列>
名前空間 std を使用します。
クラス建物{
友人 void ask(建物 *a);
公共:
建物(){
a="リビングルーム";
b="寝室";
}
文字列 a;
プライベート:
文字列 b;
};
void ask(建物 *a){
cout<<a->b;
}
int main()
{
建物x;
尋ねる(&x);
}
または
void ask(建物&a){
cout<<ab;
}
建物x;
尋ねる(x);
引用する場合に必要となります。
ポインタについては ->
2. クラスで友達ができる
フレンドクラスGoodGay。
3. メンバー機能はフレンドとして機能します
友人 void GoodGay::visit();
14. 演算子のオーバーロード
1. プラス演算子のオーバーロード
2 つのカスタム データ型を追加する操作を実装します。
クラス人
{
公共:
int a;
int b;
};
//メンバー関数のオーバーロード
個人オペレーター+ (個人&p)
{
人物t;
ta=this.a+pa;
tb=this.b+pb;
t を返します。
}
人物 p3=p1.operator(p2);
//に相当
人 p3=p1+p2;
//グローバル関数のオーバーロード
#include <iostream>
#include<文字列>
名前空間 std を使用します。
クラス人
{
公共:
int a;
int b;
};
個人オペレーター+ (個人 &p1,個人 &p2)
{
人物t;
ta=p1.a+p2.a;
tb=p1.b+p2.b;
t を返します。
}
int main()
{
人物 p1;
p1.a=10;
p1.b=10;
人物 p2;
p2.a=10;
p2.b=10;
人 p3=p1+p2;
cout<<p3.a<<endl<<p3.b;
}
2. 左シフト演算子のオーバーロード
//メンバー関数のオーバーロード
void 演算子<<(ostream&cout,person &p){
cout<<pa<<endl<<pb;
}
//グローバル関数のオーバーロードにはフレンドを実装する必要があります。そうしないとプライベート変数にアクセスできません
ostream & 演算子<<(ostream&cout,person &p){
cout<<pa<<endl<<pb;
リターンコート。
}
3. インクリメント演算子のオーバーロード
MyInteger& 演算子++(){
m_Num++;
*これを返します;
}
4. 代入演算子
人&演算子=(人&p){
if(m_Age!=NULL){
m_Age を削除します。
m_年齢=NULL;
}
m_Age=new int(*p.m_Age);
*これを返します;
}
5. 関係演算子
bool operatpr==(人&p){
if(this->m_name=p->m_name){
返却します。
}
false を返します。
}
6. 関数呼び出し演算子
void 演算子()(文字列テスト){
cout<<test<<endl;
}
-非常に柔軟で、ファンクターとも呼ばれます
- 様々な機能を実現可能
オブジェクトをインスタンス化する
MyAdd myadd;
int ret =myadd(100);
匿名関数オブジェクト
MyAdd()(100,100);
継承する
1. 基本的な文法
クラスの息子:公の父親
{
公共:
無効なコンテンツ()
{
cout<<"対応するコンテンツ";
}
};
2. 継承方法
1. パブリック継承
2. 継承を保護する
3. プライベート継承
3. 継承におけるオブジェクトモデル
親クラスのプライベート クラス メンバーは非表示になるだけですが、継承されます。
4. 構築と破壊のシーケンス
1. 親クラスの構造
2. サブクラスの構築
3. サブクラスの破壊
4. 親クラスの破棄
5. 同じ名前のメンバーを訪問する
1. 直接アクセス
さ
s.func();
サブクラスのメンバーにアクセスする
2.スコープの追加
s.Base::a
s.Base::func()
親クラスのメンバーにアクセスする
6. 同じ名前の静的メンバーにアクセスする
1. 授業内での宣言、授業外での課題
2. インスタンス化
息子さん。
さ
s.Base::a
s.func()
s.Base::func()
3. オブジェクトを直接呼び出す
息子::a
ソン::ベース::a
Son::Base::func()
7. 多重継承
クラスC:パブリックA、パブリックB
{
C c;
cA::a;
cB::a;
}
8. ダイヤモンドの継承
1. 仮想継承による解決策
クラス動物
{
公共:
int a;
};
クラス Sheep: 仮想公開動物{};
クラス Tuo: 仮想公開動物{};
クラス SheepTuo:public Sheep,public Tuo{};
仮想継承を使用する場合、SheepTuo には a が 1 つだけあり、定義ドメインを通じて変更できますが、最後に変更された値のみが表示されます。
2 つのポインター、1 つの実際の値
ポリモーフィズム
1. 静的多態性と動的多態性
1. 静的多態性
関数のオーバーロードと演算子のオーバーロード、関数名の再利用
2. 動的ポリモーフィズム
派生クラスと仮想関数は実行時ポリモーフィズムを実装します。
3.違い
静的多態性関数アドレス早期バインディング - コンパイル
動的多態性関数アドレス遅延バインディング実行
4.例
//アドレスバインディング
//animal 関数の前に virrus を追加すると、結果は猫の会話になります。
#include<iostream>
名前空間 std を使用します。
クラス動物
{
公共:
void speech()
{
cout<<"動物は話す";
}
};
クラス猫: パブリック 動物
{
公共:
void speech()
{
cout<<"猫はしゃべる";
}
};
void doSpeak(動物&a)
{
a.speak();//動物の音声を出力する
}
int main()
{
猫a;
doSpeak(a);
}
5.利用シーン
- サブクラスは親クラスを継承します
- サブクラスは親クラスの仮想関数をオーバーライドします
2. 多型原理の解析
1. 仮想機能テーブル
仮想関数テーブルを上書きする
2. 純粋仮想関数と抽象クラス
1. 親クラスの機能は通常使用しないため
関数を純粋に仮想化する
仮想ボイド関数()=0;
純粋仮想関数が配置されるクラスは、抽象クラスとも呼ばれます。
2. 制限事項
- 抽象クラスをインスタンス化できません
- 抽象クラスのサブクラスは、親クラスの純粋仮想関数をオーバーライドする必要があります。オーバーライドしないとインスタンス化できません。
3. 仮想破壊と純粋仮想破壊
1. ポリモーフィズムを使用する場合
サブクラス内にヒープに割り当てられた属性がある場合、親クラス ポインターは解放時にサブクラスのデストラクター コードを呼び出すことができません。
2.解決策:
親クラスのデストラクターを仮想デストラクターまたは純粋な仮想デストラクターに変更します。
削除は動物なので飛ばします。
親クラスの架空の関数を仮想化する
動物::~動物()=0;
#include<iostream>
#include<文字列>
名前空間 std を使用します。
クラス動物
{
公共:
virtual void speech()
{
cout<<"動物は話す";
}
};
クラス猫: パブリック 動物
{
公共:
Cat(文字列名)
{
m_name=新しい文字列(名前);
}
virtual void speech()
{
cout<<*m_name<<"猫の話";
}
~猫()
{
if(m_name!=NULL)
{
m_name を削除します。
m_name=NULL;
}
}
文字列 *m_name;
};
int main()
{
猫 a("トム");
a.speak();
}
3. 純粋な仮想デストラクターを宣言して実装する必要がある
純粋な仮想デストラクターでは、このクラスも抽象クラスに属します。
ファイル操作
1. ファイルの書き込み
1. ヘッダー ファイルをインクルードする
#include <fstream>
2. ストリームオブジェクトを作成する
オフストリーム
3.ファイルを開きます
ofs.open("アドレス", オープンメソッド);
ios::in はファイルを読み取ります
ios::out はファイルを書き込みます
ofs.open("stest.txt",ios::out);
4. データの書き込み
ofs<<"";
5. ファイルを閉じます
ofs.close();
2. ファイルを読み取る
1. ヘッダー ファイルをインクルードする
#include <fstream>
2. ストリームオブジェクトを作成する
オフストリームの場合
3.開く
ifs.open("stest.txt",ios::in);
4.データの読み取り
-最初
char buf[1024]={0};
while(ifs>>buf)
{
cout<<buf<<endl;
}
-2番目のタイプ
char buf[1024]={0};
while(ifs.getline(buf,sizeof(buf)))
{
cout<<buf<<endl;
}
-3番目のタイプ
チャーバフ。
while(ifs.getline(buf))
{
cout<<buf<<endl;
}
-第四種
文字c;
while((c=ifs.get())!=EOF)
{
cout<<c;
}
5. ファイルを閉じます
ifs.close();
3. バイナリ読み込みファイル
1. ヘッダー ファイルをインクルードする
#include <fstream>
2. ストリームオブジェクトを作成する
オフストリーム
3.ファイルを開きます
ofs.open("アドレス", オープンメソッド);
ios::in はファイルを読み取ります
ios::out はファイルを書き込みます
ofs.open("stest.txt",ios::out|ios::binary);
4. データの書き込み
ペロン p;
ofs<<"";
ofs.write((const char*)p);
5. ファイルを閉じます
ofs.close();
4. バイナリ書き込みファイル
1. ヘッダー ファイルをインクルードする
#include <fstream>
2. ストリームオブジェクトを作成する
オフストリームの場合
3.開く
ifs.open("stest.txt",ios::in|ios::binary);
4.データの読み取り
ペロン p;
ifs.read((char*)&p,sizeof(人));
cout<<p.m_Name<<p.m_Age<<endl;
5. ファイルを閉じます
ifs.close();