C++の注意事項

7967 ワード

1、クラスの构造:MyClassがカスタムクラスであると仮定すると、MyClass a[3]、*p[2];実際にコンストラクション関数を実行する回数は3回しかありません.つまり、オブジェクトポインタ配列がコンストラクション関数を実行することはありません.
2、常データメンバー:常データメンバーについては、宣言時に一括して初期化(c++11)したり、構造関数内で初期化したりすることができます.ただし、初期化しないわけにはいきません.宣言時に初期化すると、コンストラクション関数内でも通常のメンバー関数内でも値を変更することはできません.クラス内で宣言して値を初期化しないと、コンストラクション関数の初期化リストでのみ値を初期化でき、コンストラクション関数内で初期化できず、通常のメンバー関数内で初期化できません.
#include <iostream>

class Myclass{
public:
    Myclass()
        :a(4)
    {
        std::cout << "Constructor" << std::endl;
    }
private:
    const int a;
};

int main(void)
{
    Myclass a[3],*p[2];
    return 0;
}

3、常メンバー関数と常データメンバー:クラスの常メンバー関数は常データメンバーを操作できますが、変更できません.通常のメンバー関数は、通常のデータ・メンバーを操作できますが、変更できません.つまり、通常のデータ・メンバーは、関数で値を変更できません.つまり、Read-Onlyのみです.
class Myclass{
public:
    Myclass(){value = 0;};//    
    void SetValue(int i){value = i;}//  value 
private:
    int value;
};

int main(void)
{
    Myclass *p,my;//     Myclass    p     my。
    p = &my;// p    my。
    return 0;
}

4、データメンバーがポインタの場合:
class Myclass{
public:
    Myclass(){}
    Myclass(int i){value = new int(i);}
private:
    int* value;
};

valueに値を割り当てるには、コンストラクション関数Myclass(int i)を使用して、次の操作を行います.
Myclass my(10);

5、コピー初期化コンストラクタ:カスタマイズがなければ、C++は自動的にコピー初期化コンストラクタを作成する.
class Myclass{
public:
    Myclass(){}
    Myclass(int i){value = new int(i);}
private:
    int* value;
};

int main(void)
{
    Myclass my(10);
    Myclass my2 = my;//          my2.   Myclass my2(my);
    return 0;
}

6、const int*xとint*const xの違い:
int main(void)
{
    int i = 3;
    const int* x = &i;
    *x = 4;//   ,   const   int*     
    return 0;
}

このconstがint*xを修飾していること,すなわち,このポインタが指すオブジェクトの値は修正できないことを明確に認識しなければならない.では、このポインタの指向を変更できますか?答えは可能です.次のコードを参照してください.constは*x、すなわちxが指すオブジェクトにのみ作用するからである.
int main(void)
{
    int i = 3;
    int j = 5;
    const int* x = &i;
    x = &j; //     ,          
    return 0;
}

次のint*const xは?このいくつかの方面から着手します:xの指向を修正することができますか?xが指すオブジェクトの値を変更できますか?xをconst以外に向けることができますか?
int main(void)
{
    int i = 3;
    int j = 5;
    int* const x = &i;//x     const。
    x = &j;     //  ,    x   。
    *x = 5;     //  ,  x    const  ,               ,      i,  i     5.
    return 0;
}

まとめると、constが何を修飾しているかを見ることです!constタイプ名*ポインタ名の場合;このような表現は同じ理屈だ.(1)int*xを修飾すると,修飾のポインタ自体ではなく,修飾のポインタが指すオブジェクトであることを示し,結果としてポインタは指向を変えることができるが,ポインタが指すオブジェクトの値は変えられない.(2)xを修飾すると、ポインタの指向は変更できない(Read-ONlyの)ことを示すが、ポインタが指すオブジェクトの値が変更されるかどうかは、指向するオブジェクト自体がconstであるかどうかにかかっており、もしそうであれば修正されず、そうでなければ修正されることができる.
7、new演算子に対してオブジェクトとオブジェクト配列の問題を作成する:
#include <iostream>
class MyClass{
public:
    MyClass(){std::cout << "MyClass Constructor." << std::endl;}
};

int main(void)
{
    MyClass* p = new MyClass;    //         。
    MyClass* q = new MyClass[10];  //         。
    return 0;
}

8、C++のマクロ置換について:(これは大きな部分の内容が学習を補充する必要がある)定義されたマクロ関数はどのように置換されていますか?△C言語の遺留問題.このようなマクロ置換の書き方を見て、テンプレートと似ていますが、現在はコンパイルが通らず、廃棄されているのではないでしょうか.
#include <iostream>

#define MY_CLASS(classname,classdatatype)
class classname{
public:
    classname(classdatatype i = 0){value = i;}
private:
    classdatatype value;
};
MY_CLASS(MyClass,int);
MY_CLASS(OtherClass,double);
int main(void)
{
    MyClass my(3);
    OtherClass my2(2.0);
    return 0;
}