C++学習7:staticとthis、および単例モード
12107 ワード
学習の前に,まず複数のクラス:C++学習4:ポインタを持たないクラス(侯捷Complexクラスを例に)を振り返る.
1静的タイプstatic
1.1静的でない場合(non_static)
1、non_staticのメンバー関数はthisによってnon_を呼び出すstaticのオブジェクト:
次の内容と同じです.
このメンバー関数real()はthisによって呼び出されることがわかります.
2、this:括弧の中には必ず書けない.関数の中には書くか書かないか、書かないときはコンパイラがつけてくれる.上のreal、正常な書き方(1)と完全な書き方(2)は以下の通りです.
1.2静的状況
1、staticはオブジェクトの前に追加され、オブジェクトから離れ、オブジェクトに属しません.他のメモリ領域が存在し、静的データになり、1部しかありません.(銀行口座の例:ユーザークラスは非静的オブジェクト、金利クラスは静的オブジェクト)2、staticはメンバー関数の前に加算され、他のメンバー関数とほぼ同じです.唯一の違いは、静的メンバー関数にthisがないことです.他のメンバー関数のようにオブジェクトにアクセスしたり処理したりすることはできません.静的データの処理に使用します.次の例:
静的データはクラスで宣言された後、外層で定義されることがわかります.この定義は、例のように初期値を付与してもよいし、値を付与しなくてもよいです.静的メンバー関数の呼び出し方法は2つあります.1.クラス名で直接呼び出す.2.オブジェクトによって呼び出されます.一般的なメンバー関数は、オブジェクト呼び出し時にthisポインタがありますが、静的メンバー関数にはポインタはありません.
2例:ctorをprivate領域に置く-単例モードsingleton
前述の部分:Complexクラスの1.3.3.5. 単一のスキーマの要求:クラスを作成し、オブジェクトを1つだけ生成します.ctorをprivate領域に配置した結果、staticを除いて作成できるオブジェクトはありません.外部がこのオブジェクトを取得するにはstatic関数,すなわち静的関数を用いなければならない.クラス名で静的関数を呼び出してこのオブジェクトを取得した後、このオブジェクトの他のpublic操作を行うことができます.
ここでaはstaticで、メモリにずっと存在します.メモリをさらに使用できるようにするには、次のように改善します.
1静的タイプstatic
1.1静的でない場合(non_static)
1、non_staticのメンバー関数はthisによってnon_を呼び出すstaticのオブジェクト:
complex c1,c2,c3;
cout << c1.real();
cout << c2.real();
次の内容と同じです.
complex c1,c2,c3;
cout << complex::real(&c1); // c1 (& ) c1 this.
cout << complex::real(&c2); // c2 (& ) c2 this.
このメンバー関数real()はthisによって呼び出されることがわかります.
2、this:括弧の中には必ず書けない.関数の中には書くか書かないか、書かないときはコンパイラがつけてくれる.上のreal、正常な書き方(1)と完全な書き方(2)は以下の通りです.
double real() const { return re;} ***************************1
double real( this ) const { return this->re;} ***************2
1.2静的状況
1、staticはオブジェクトの前に追加され、オブジェクトから離れ、オブジェクトに属しません.他のメモリ領域が存在し、静的データになり、1部しかありません.(銀行口座の例:ユーザークラスは非静的オブジェクト、金利クラスは静的オブジェクト)2、staticはメンバー関数の前に加算され、他のメンバー関数とほぼ同じです.唯一の違いは、静的メンバー関数にthisがないことです.他のメンバー関数のようにオブジェクトにアクセスしたり処理したりすることはできません.静的データの処理に使用します.次の例:
class Account
{
public:
static double m_rate;
static void set_rate(const double& x) { m_rate = x; }
};
Account::m_rate = 8.0;
int main()
{
Account::set_rate(5.0); ***** 1
Account a;
a.set_rate(3.0); ************* 2
}
静的データはクラスで宣言された後、外層で定義されることがわかります.この定義は、例のように初期値を付与してもよいし、値を付与しなくてもよいです.静的メンバー関数の呼び出し方法は2つあります.1.クラス名で直接呼び出す.2.オブジェクトによって呼び出されます.一般的なメンバー関数は、オブジェクト呼び出し時にthisポインタがありますが、静的メンバー関数にはポインタはありません.
2例:ctorをprivate領域に置く-単例モードsingleton
前述の部分:Complexクラスの1.3.3.5. 単一のスキーマの要求:クラスを作成し、オブジェクトを1つだけ生成します.ctorをprivate領域に配置した結果、staticを除いて作成できるオブジェクトはありません.外部がこのオブジェクトを取得するにはstatic関数,すなわち静的関数を用いなければならない.クラス名で静的関数を呼び出してこのオブジェクトを取得した後、このオブジェクトの他のpublic操作を行うことができます.
class A
{
public:
static A& getInstance() { return a; };
setup(){...}
private:
A();
A(const A& rhs);// private
};
A::getInstance().setup();
ここでaはstaticで、メモリにずっと存在します.メモリをさらに使用できるようにするには、次のように改善します.
class A
{
public:
static A& getInstance();
setup(){...}
private:
A();
A(const A& rhs);// private
};
A& A::getInstance()
{
static A a;
return a;
}
A::getInstance().setup();