[CPP Module 00] Namespace, class, member functions, stdio stream, initialization lists, static, const
23940 ワード
1.オブジェクト指向の理解
オブジェクト向けテクノロジーは,符号化エラーを低減し,コードの可読性を向上させ,メンテナンスしやすいコードを記述することができる.データと機能が結合した概念をオブジェクトと呼ぶ.プログラミング言語でオブジェクトを実現する手段をクラスと呼ぶ.
一般に、データの処理には構造体が使用され、機能の処理にもクラスが使用されます.
1.1. オブジェクトを構成するのはデータと機能です
電話帳プログラムでオブジェクト向けについて知りましょう.このプログラムは電話帳のオブジェクトに存在します.そして、私は以下のことをします.
class Contact
{
private:
std::string first_name;
std::string last_name;
std::string phone_number;
public:
void set_first_name(const std::string str);
void set_last_name(const std::string str);
void set_phone_number(const std::string str);
std::string get_first_name(void) const;
std::string get_last_name(void) const;
std::string get_phone_number(void) const;
};
1.2. オブジェクトとインスタンス
実際には,宣言占有メモリをインスタンス化,実際に占有メモリの変数などをインスタンスと呼ぶ.メモリ内の特定のクラスタイプのオブジェクトもインスタンスと呼ばれます.
1.3. オブジェクト向けプログラミングの特徴
2.アクセス制御
次の3つのアクセス制御インジケータにより、クラス内のメンバーへの外部からの直接アクセスを許可または禁止できます.近接関数を用いてカプセル化を最大化できた.
public
:すべての外部アクセスメンバーを許可private
:すべてのアクセスを禁止protected
:継承関係から派生クラスへのアクセスのみ許可2.1. 情報の非表示とカプセル化
#include <iostream>
using namespace std;
struct TV
{
bool powerOn;
int channel;
int volume;
void setVolume(int vol)
{
if (vol >= 0 && vol <= 100)
volume = vol;
}
};
int main()
{
TV lg;
lg.powerOn = true;
lg.channel = 11;
lg.setVolume(50);
lg.volume = 400; // 의도치 않은 접근 가능
}
TV構造体の各メンバーを定義し、メイン関数で初期化しています.ボリュームのサイズを0~100に制限する場合は、上記の例のように構造体の内部にsetVolumeという関数を作成して使用できます.しかし、上記のコードの問題は、ボリュームメンバーにアクセスできることです.次のコードのように,アクセスインジケータを用いて情報隠蔽を実現し,より安定したプログラムを開発することができる.
#include <iostream>
using namespace std;
struct TV
{
private: //외부 접근 차단
bool powerOn;
int channel;
int volume;
public: //외부 접근 허용
void on()
{
powerOn = true;
cout << "TV on." << endl;
}
void off()
{
powerOn = false;
cout << "TV off." << endl;
}
void setChannel(int num)
{
if (num >= 1 && num <= 999)
channel = num;
cout << "채널을 " << num << "(으)로 변경했습니다." << endl;
}
void setVolume(int vol)
{
if (vol >= 0 && vol <= 100)
volume = vol;
cout << "볼륨을 " << vol << "(으)로 변경했습니다." << endl;
}
};
int main()
{
TV lg;
lg.powerOn = on();
lg.setChannel(11);
lg.setVolume(50);
}
メンバー変数をprivateとして宣言し、その変数にアクセスする関数を定義し、メンバー変数のアクセスを安全な形式で導くことが情報隠蔽であり、良いクラスになるための基本条件である.このように一部のメンバーを保護し,また外部ユーザに近づくことができるインタフェースを作成することを「カプセル化」と呼ぶ.3.メンバー関数の定義方法
メンバー関数を定義するには、2つの方法があります.
::
使用演算子(範囲解析オペレータ)#include <iostream>
using namespace std;
class TV
{
private:
bool powerOn;
int volume;
public:
// 내부 클래스 정의
void on()
{
powerOn = true;
cout << "TV on." << endl;
}
void off()
{
powerOn = false;
cout << "TV off." << endl;
}
// 외부 클래스 정의
void setVolume(int vol);
};
// 외부 클래스 정의
void TV::setVolume(int vol)
{
if (vol >= 0 && vol <= 100)
volume = vol;
cout << "볼륨을 " << vol << "(으)로 변경했습니다." << endl;
}
int main()
{
TV lg;
lg.powerOn = on();
lg.setVolume(50);
}
通常、外部クラス定義が使用されます.4.生成者と消滅者
4.1. コンストラクタ
すべてのメンバー変数を初期化するまで、インスタンスは使用できません.privateメンバーは通常の方法で初期化できないため、CPPは作成者というメンバー関数を提供します.クラスにオブジェクトを作成するたびに、コンパイラはクラスの作成者を自動的に呼び出します.
#include <iostream>
using namespace std;
class TV
{
private:
bool powerOn;
int volume;
public:
TV(void); // 생성자 함수의 원형
}
// 생성자 함수
TV::TV(void)
{
powerOn = true;
volume = 50;
}
int main()
{
TV lg; // 생성자의 암시적 호출
// TV lg = TV // 생성자의 명시적 호출
}
4.2. イニシエータリスト
頭文字のRiserリストは、オブジェクトまたはメンバー変数の初期化をより簡単にします.
class TV
{
private:
bool powerOn;
int volume;
public:
TV(void)
: volume(50)
{} //이니셜라이저를 통한 초기화
}
,
(カンマ)をカンマでリストします.4.3. 消滅者(destructor)
生成者とは逆に,オブジェクト消滅時に呼び出さなければならないのは消滅者である.
~
の名前が付いています.5.クラスの外部にアクセスするメンバー変数 class Contact
{
private:
std::string first_name;
std::string last_name;
std::string phone_number;
public:
void set_first_name(const std::string str);
void set_last_name(const std::string str);
void set_phone_number(const std::string str);
std::string get_first_name(void) const;
std::string get_last_name(void) const;
std::string get_phone_number(void) const;
};
5.1. アクセス関数
クラスのアクセス指定子としてprivate
を使用し、アクセス関数を使用してカプセル化を最大化します.
5.2. const関数
getter関数の後ろにconst
インジケータが表示されます.const
この関数では、メンバー変数に格納されている値は変更されません.したがって、const宣言が追加されたメンバー関数内でメンバー変数の値を変更すると、コンパイルエラーが発生します.const関数では、const関数以外の呼び出しが制限されます.これは,メンバ変数の値が変化する可能性をいっそ許さないためである.
6.CPPの静的
6.1. 静的メンバー変数
静的メンバー変数はクラス内のグローバル変数の概念と見なすことができる.すなわち、1つの静的メンバー変数は、同じクラスのすべてのオブジェクトに使用できます.静的メンバー変数にはクラス名を使用してアクセスする必要があります.private静的メンバー変数には静的メンバー関数を使用してアクセスします.
6.2. 静的メンバー関数
クラスのメンバー関数は、静的(static)として宣言することもできます.このように宣言された静的メンバー関数は、クラスのオブジェクトを作成することなく、クラス名のみを呼び出すことができます.これらの静的メンバー関数には、次の特徴があります.
class Contact
{
private:
std::string first_name;
std::string last_name;
std::string phone_number;
public:
void set_first_name(const std::string str);
void set_last_name(const std::string str);
void set_phone_number(const std::string str);
std::string get_first_name(void) const;
std::string get_last_name(void) const;
std::string get_phone_number(void) const;
};
6.1. 静的メンバー変数
静的メンバー変数はクラス内のグローバル変数の概念と見なすことができる.すなわち、1つの静的メンバー変数は、同じクラスのすべてのオブジェクトに使用できます.静的メンバー変数にはクラス名を使用してアクセスする必要があります.private静的メンバー変数には静的メンバー関数を使用してアクセスします.
6.2. 静的メンバー関数
クラスのメンバー関数は、静的(static)として宣言することもできます.このように宣言された静的メンバー関数は、クラスのオブジェクトを作成することなく、クラス名のみを呼び出すことができます.これらの静的メンバー関数には、次の特徴があります.
this
ポインタはありません.Reference
この問題について([CPP Module 00] Namespace, class, member functions, stdio stream, initialization lists, static, const), 我々は、より多くの情報をここで見つけました https://velog.io/@24siefil/CPP-Module-00テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol