C ++:データメンバの初期化と割り当て


1.デフォルトの初期化

#include <iostream>
#include <string>
using namespace std;
class A
{
public:
    int m;
    string s;
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m << endl;//类内内置类型未定义
    cout << a1.s << endl;//string默认初始化为空串
    cout << "----------------------------" << endl;
    return 0;
}

業績

  1. ときにクラスがないクラスのコンストラクタと初期値は、コンパイラは、合成デフォルトコンストラクタでデフォルトのデータメンバに初期化されます。
  2. 初期化デフォルトでは、変数が初期化されていないビルトインタイプとクラス関数の本体内の変数の種類と位置によって決定されるデフォルト値、すなわち、未定義が割り当てられます。

2.クラスの初期値(コンパイラが部分をサポートしていません)

#include <iostream>
#include <string>
using namespace std;
class A
{
public:
    int m = 1;
    string s = "a";
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m << endl;
    cout << a1.s << endl;
    cout << "----------------------------" << endl;
    return 0;
}

業績

  1. ときにクラスコンストラクタが、クラスの初期値があり、コンパイラ合成デフォルトコンストラクタは、クラスのデータメンバを初期化する初期値を使用することにより、。

コンストラクタ内3.割り当て

#include <iostream>
#include <string>
using namespace std;
class A
{
public:
    A() //显式创建的构造函数
    {
        m = 2;
        s = "b";
    }
    int m = 1;
    string s = "a";
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m << endl;
    cout << a1.s << endl;
    cout << "----------------------------" << endl;
    return 0;
}

業績

  1. クラスのコンストラクタ、代入の関数内で明示的に作成され、その結果は、クラス初期化子をカバーします。
  2. メンバである場合はCONST、参照型、またはこのクラスのいくつかは、デフォルトコンストラクタを提供されていない、そのメンバーは初期化されなければならない、方法を譲渡することはできません。

4.コンストラクタの初期化リスト

#include <iostream>
#include <string>
using namespace std;
class B //不含默认构造函数
{
public:
    int n;
    B(int x) //默认构造函数无参数,此构造函数不是默认构造函数
    {
        n = x;
    }
};

class A
{
public:
    A() : m1(10), m2(20), r(m2), b(40) //显示创建的构造函数
    {
        m1 = 100;
    }
    int m1 = 1;
    const int m2 = 2;  //const
    const int &r = m1; //引用
    B b;               //未提供默认构造函数
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m1 << endl;
    cout << a1.m2 << endl;
    cout << a1.r << endl;
    cout << a1.b.n << endl;
    cout << "----------------------------" << endl;
    return 0;
}

業績

  1. メンバーがいる場合のconst、参照型、またはこのクラスのいくつかは、デフォルトコンストラクタを提供されていない、そのメンバーは、しなければならないリストのコンストラクタの初期化初期化を。
  2. 優先順位:デフォルトの初期化<クラス初期化子<コンストラクタ初期化リスト<コンストラクタ代入。値データメンバは、優先度の高い値の適用範囲です。

注意:

#include <iostream>
#include <string>
using namespace std;
class B //不含默认构造函数
{
public:
    int n;
    B(int x, int y) //默认构造函数无参数,此构造函数不是默认构造函数
    {
        n = x * y;
    }
};

class A //类内初始值
{
public:
    int m1 = 1;
    const int m2 = 2; //const
    int &r = m1;      //引用
    B b = B(3, 4);    //未提供默认构造函数
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m1 << " " << a1.m2 << " " << a1.r << " " << a1.b.n << endl;
    a1.m1 = 0; //m1是int,可修改
    // a1.m2 = 0; //错误,m2是const int,不可修改
    a1.r = 5;       //r引用m1,对r的修改实际是对m1的修改
    a1.b = B(0, 0); //b是类类型,可赋值修改
    cout << a1.m1 << " " << a1.m2 << " " << a1.r << " " << a1.b.n << endl;
    cout << "----------------------------" << endl;

    A a2, a3; //a2.m2和a3.m2不可修改,且总是相等
    cout << a2.m2 << endl;
    cout << a3.m2 << endl;
    cout << "----------------------------" << endl;
    return 0;
}

業績

#include <iostream>
#include <string>
using namespace std;
class B //不含默认构造函数
{
public:
    int n;
    B(int x, int y) //默认构造函数无参数,此构造函数不是默认构造函数
    {
        n = x * y;
    }
};

class A //构造函数初始化列表
{
public:
    A() : m1(1), m2(2), r(m1), b(3, 4) {}                               //默认构造函数
    A(int i1, int i2, int x, int y) : m1(i1), m2(i2), r(m1), b(x, y) {} //普通构造函数

    int m1;
    const int m2; //const
    int &r;       //引用
    B b;          //未提供默认构造函数
};

int main()
{
    A a1;
    cout << "----------------------------" << endl;
    cout << a1.m1 << " " << a1.m2 << " " << a1.r << " " << a1.b.n << endl;
    a1.m1 = 0; //m1是int,可修改
    // a1.m2 = 0; //错误,m2是const int,不可修改
    a1.r = 5;       //r引用m1,对r的修改实际是对m1的修改
    a1.b = B(0, 0); //b是类类型,可赋值修改
    cout << a1.m1 << " " << a1.m2 << " " << a1.r << " " << a1.b.n << endl;
    cout << "----------------------------" << endl;

    A a2(1, 2, 3, 4), a3(10, 20, 30, 40); //a2.m2和a3.m2不可修改,但a2.m2和a3.m2可以不同
    cout << a2.m2 << endl;
    cout << a3.m2 << endl;
    cout << "----------------------------" << endl;
    return 0;
}

業績

  1. メンバーである場合はCONST、またはこのクラスの型のデフォルトコンストラクタ提供していないいくつかの参照して、時間をクラスの初期値初期化は、コンパイラが指定されていない、プログラムが実行されています。
  2. ときに初期値にCONSTクラスのメンバーの初期化に使用オブジェクト・クラスは、それらのconstメンバを変更できない場合、そのconstメンバ異なるオブジェクトが等しい、クラスのクラス外ない差のconst CONST。
  3. ときのconstメンバを初期化するために、コンストラクタの初期化リストを使用して、オブジェクトのクラスは、あなたのconstメンバーを変更することはできませんが、その値はconstメンバ異なるオブジェクトは異なる場合があり、使用クラスに沿って、。
公開された77元の記事 ウォン称賛25 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_34801642/article/details/104873403