C ++動的オブジェクト配列に関する知識の要約

デフォルトのコンストラクタ

    まず、次のコードなど、デフォルトのコンストラクターを見てみましょう。

#include<iostream>
#include<math.h>
using namespace std;
class Point
{
    double x, y;
public:
    void print();
    Point(double a=0,double b=1){x=a;y=b;}  //默认构造函数
    Point(double a){x=1;y=1;} //构造函数
    Point(){} //默认构造函数

};
void Point::print()
{
    cout << x << " " << y << endl;
}

    したがって、オブジェクトがパラメータを渡さずに生成される場合、通常、デフォルトのコンストラクタを使用できることがわかります。対応する状況は次のとおりです。

Point point;   
Point *point=new Point;

    デフォルト以外のコンストラクターはパラメーターを渡す必要があります。デフォルトのコンストラクターについては、次の知識ポイントがあります。

  • プログラムはコンストラクターを定義せず、デフォルトのコンストラクターPoint(){}があり、メンバーの値は初期化されません
  • デフォルトのコンストラクターを定義する方法は2つあります。上記のコードに示すように、1つはパラメーターなしでコンストラクターを定義する方法、もう1つはすべてのパラメーターに対してデフォルト値でコンストラクターを定義する方法です。
  • 注:クラスには、デフォルトのコンストラクターを1つだけ含めることができます。つまり、上記の2つのメソッドを同時に表示することはできません。通常は、Point()を選択します。この形式のデフォルトコンストラクター

デフォルトのコンストラクターを使用した動的配列

    クラスにデフォルトのコンストラクターがあるかどうかを見てみましょう。次のコードは、静的配列と動的配列を生成するためのものです。

#include<iostream>
#include<math.h>
using namespace std;
class Point
{
    double x, y;
public:
    void print();

};
void Point::print()
{
    cout << x << " " << y << endl;
}
int main() {
    //静态对象数组
    Point pp[5];      
    for (int i = 0; i<5; i++)
        pp[i].print();
    //动态对象数组
    Point *p = new Point[5]; //这里面5也可以是变量
    for (int i = 0; i<5; i++)
            p[i].print();
    //别忘记delete相应的空间
}

    クラスにデフォルトのコンストラクターがある場合、それを生成するときにパラメーターを渡す必要がないことがわかります。これははるかに便利です。

デフォルトのコンストラクターのない動的配列

    クラスにデフォルトのコンストラクターがない場合、この場合、次のコードのようにパラメーターを渡す必要があります。

#include<iostream>
#include<math.h>
using namespace std;
class Point
{
    double x, y;
public:
    Point(double a, double b);
    void print();
};
Point::Point(double a, double b)
{
    x = a;
    y = b;
}
void Point::print()
{
    cout << x << " " << y << endl;
}
int main()
{
    Point *p[5];//静态指针数组
    for (int i = 0; i < 5; i++) {
        p[i] = new Point(i, i);    //其中你可以用自己的方式来初始化对象,例如从键盘接收值等
    }
    for (int i = 0; i < 5; i++) {
        p[i]->print();
    }
    Point **pp = new Point *[5];  //动态指针数组,5也可以是变量
    for (int i = 0; i < 5; i++) {
        pp[i] = new Point(i, i);
    }
    for (int i = 0; i < 5; i++) {
        pp[i]->print();
    }
    //别忘了delete相应的空间
    return 0;
}

    静的ポインタ配列はPoint、各ポインタがオブジェクトを指すようにする新しい方法を通じて、いくつかのポインタを定義します。動的ポインタ配列は固定サイズの連続空間を割り当て、その中の各要素タイプはでありPoint *、この連続空間の最初のアドレスは、Point *型へのポインタであるppに与えられます。

new(Point *)[5]ではなくnew Point * [5]であることに注意してください。後者のコンパイラは、エラーを報告します。

新しい多次元配列

int *p=new int[2];
int *p=new int[2][3];  //错误
int (*p)[3]=new int[2][3];  //正确
int (*p)[4][5]=new int[2][4][5]; //正确

    2行目が間違っているのはなぜですか?実際、次のように理解できます。

  • int(* p)[3]ここで、pはポインターです。これは疑いの余地がありません。このポインターはどのようなデータを指しますか?int [3](* p)をプログラミングして、書き方を変えましょう。それは非常に簡潔で明確ですか?pが指すタイプはint [3]です。
  • new int [2] [3]によって返される2つのint [3]タイプの配列の最初のアドレスがpに割り当てられます。
  • 同様に、4行目のpが指すタイプはint [4] [5]であり、new int [3] [4] [5]は、タイプint [4] [5]の3つの配列の最初のアドレスを返します。 pを与える。
  • 最初の行では、intが4バイトを占めると仮定して、pの初期アドレスが1000の場合、p ++を実行した後、pのアドレスは1000 + 4になり、3行目では、pの初期アドレスが1000、p ++を実行した後、pの値は1000 + 4 * 3になり、以下同様に、4行目のp ++の後のpの値は1000+ 4 * 4 * 5になります。

おすすめ

転載: blog.csdn.net/u012397189/article/details/78784928