デフォルトのコンストラクタ
まず、次のコードなど、デフォルトのコンストラクターを見てみましょう。
#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になります。