。レッスン24古典的な問題解決(1つのデストラクタの順序の; 2.const変更されたオブジェクト; 3.メンバ関数、メンバ変数オブジェクト固有かどうか)

プログラム・オブジェクトが複数ある場合は1、どのようにこれらのオブジェクトのデストラクタの順序を決定するには?

単一のオブジェクト

作成された単一のオブジェクトコンストラクタコールシーケンス
A。スーパークラスのコンストラクタ呼び出し
Bを(同じ呼び出しシーケンス宣言順序)コンストラクタコールメンバ変数
C。コンストラクタは、クラス自体呼び出し

呼び出しシーケンスコンストラクタとデストラクタ対応する反対

複数のオブジェクト

場合対向構成デストラクタ配列を有する複数のオブジェクト、

例えば:このコードは、エンド上記で説明することができます

#include <stdio.h>

class Member
{
    const char *ms;        //这里是const指针
    
public:
    Member(const char *s)
    {
        printf("Member(const char* s): %s\n", s);

        ms = s;        //因为上述被定义为指针所以这里才能间接的去修改。
    }
    
    ~Member()
    {
        printf("~Member(): %s\n", ms);
    }
};

class Test
{
    Member mA;
    Member mB;
 
 public:
    Test() : mB("mB"), mA("mA")
    {
        printf("Test()\n");
    }
    
    ~Test()
    {
        printf("~Test()\n");
    }
};

Member gA("gA");

int main()
{
    Test t;
    
    return 0;
}

スタックプッシュと同様スタックオブジェクトとグローバルオブジェクト、および配列について、最初のオブジェクト構成の最終的な構成
デストラクタヒープオブジェクトは、削除を使用する場合の使用に関連する注文を削除発生します

2.constキーワードは、オブジェクトのクラスを変更することができますか?もしそうなら、何が特徴?

constオブジェクト

a.constキーワードは、オブジェクト変更することができる
変更されたオブジェクトb.constは読み取り専用オブジェクト
C。読み取り専用メンバ変数のオブジェクトを直接変更することはできない(なぜなら、その変数の読み取り専用変数となった)
、D。オブジェクトは読み取り専用でコンパイルフェーズをコンセプト、ランタイム無効

constメンバ関数

a.constオブジェクトはconstメンバ関数を呼び出すことができる
唯一のconstメンバ関数を呼び出すことができメンバ関数b.const
メンバ関数c.constすることができない直接(それは読み取り専用変数となるため変数)メンバ変数の値を上書きします

constメンバ関数が定義されています:関数のconstキーワードの後ろに加え、体の前に。
クラス内の関数宣言と実際の関数定義は、constキーワードでなければなりません。

Type ClassName::function(Type p) const

constメンバ変数(20回のレッスン、学習比較するためにここに置きます)

constメンバ変数a。クラスは、スペース割り当てられる
Bを。変数のconstメンバ変数の性質は読み取り専用であるクラス
C。CONSTクラスのメンバ変数のみ(初期リストの初期値を指定することができ、もちろん、クラスポインタとすることができます間接的に、)このレッスンでは最初の例を参照して、修正する
(コンパイラは直接初期値のconstメンバ変数を取得することはできませんので、本当の意味で一定となるシンボルテーブルを入力することはできません)

#include <stdio.h>

class Test
{
    int mi;
    
public:
    int mj;
    Test(int i);
    Test(const Test& t);
    int getMi() const;      //const函数
};

Test::Test(int i)
{
    mi = i;
}

Test::Test(const Test& t)
{
    //如果去掉int getMi() const;的const使他成为一个普通到成员函数时使用下面语句是否合法 (此时函数到定义也要去掉相应到const)    
    mi = t.getMi();         //不合法,因为const Test& t表明t是const对象,所以t只能调用const函数。        
}

int Test::getMi() const
{
    //mi = 2;       //不合法
    return mi;
}

int main()
{
    const Test t(1);        //const对象
    
    printf("t.getMi() = %d\n", t.getMi());       //注意函数的使用不带const
    
    return 0;
}

3.メンバ関数とメンバ変数は、特定のオブジェクトで行う提携していますか?

。オブジェクト指向の観点から
オブジェクトは、属性(メンバ変数)とメソッド(メンバ関数)設定した
Bを。プログラムから実行されている角度
オブジェクトのみ(データ(スタック、ヒープ、グローバルデータエリアに配置することができる)、及び機能を有します位置スニペット)

結論:

。各オブジェクトは、独自の独立した属性(メンバ変数)を持つ
B.メソッドすべてのオブジェクトクラス(メンバ関数)の共有
を直接オブジェクトのプロパティにアクセスするにはC.メンバ関数を
dは。メンバ関数隠されたパラメータこれを参照するために使用されます現在のオブジェクトに代わって(共有メンバ関数は、このパラメータは、オブジェクトの現在のアドレスを記録します?あなたはそれを呼び出すどのオブジェクトを区別する方法です)

Test::Test(const Test& t)
{  
    //这里来源于上述例子中,稍做修改。是否合法?t.mi是private怎么能被这样t.mi把它拿出来使用?
    mi = t.mi;          //合法,因为mi是类的成员变量。并且t.mi在拷贝函数中使用(特殊的成员函数)。成员函数能够直接访问对象的属性。     
}

おすすめ

転載: www.cnblogs.com/huangdengtao/p/11843071.html