Construtor padrão
Primeiro, vamos dar uma olhada em qual é o construtor padrão, como o seguinte trecho de código:
#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;
}
Portanto, você pode saber que o construtor padrão geralmente pode ser usado quando o objeto é gerado sem passar parâmetros. A situação correspondente é:
Point point;
Point *point=new Point;
Os construtores não padrão devem passar parâmetros. Existem os seguintes pontos de conhecimento sobre o construtor padrão:
- O programa não define nenhum construtor, existe um construtor padrão Point () {} e os valores dos membros não são inicializados
- Existem duas maneiras de definir um construtor padrão. Conforme mostrado no código acima, uma é definir um construtor sem parâmetros e a outra é definir um construtor com valores padrão para todos os parâmetros.
- Nota: Uma classe pode ter apenas um construtor padrão! Em outras palavras, os dois métodos acima não podem aparecer ao mesmo tempo, geralmente escolha Point (); esta forma de construtor padrão
Matriz dinâmica com construtor padrão
Vamos dar uma olhada se uma classe tem um construtor padrão, o código a seguir é para gerar matrizes estáticas e dinâmicas:
#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相应的空间
}
Pode-se ver que se uma classe tem um construtor padrão, então não há necessidade de passar parâmetros ao gerá-lo, o que é muito mais conveniente.
Matriz dinâmica sem construtor padrão
Se uma classe não tem um construtor padrão, neste caso você precisa passar parâmetros, como no código a seguir:
#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;
}
O array de ponteiros estáticos é definido por alguns Point
ponteiros, através da nova forma de fazer cada ponteiro apontar para o objeto. O array de ponteiros dinâmicos aloca um espaço contínuo de tamanho fixo, e cada tipo de elemento nele é Point *
, e então o primeiro endereço desse espaço contínuo é dado a pp, que é um ponteiro para o tipo Point *.
Observe que é o novo Ponto * [5] em vez de novo (Ponto *) [5], o último compilador relatará um erro
nova matriz multidimensional
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]; //正确
Por que a segunda linha está errada? Na verdade, podemos entender assim:
- int (* p) [3] onde p é um ponteiro. Isso está fora de dúvida. Para que tipo de dados esse ponteiro aponta? Vamos mudar a forma de escrever, programar int [3] (* p), é muito conciso e claro? O tipo apontado por p é int [3].
- O primeiro endereço das duas matrizes do tipo int [3] retornadas por new int [2] [3] é atribuído a p.
- Da mesma forma, o tipo apontado por p na quarta linha é int [4] [5], e new int [3] [4] [5] retorna o primeiro endereço de 3 arrays do tipo int [4] [5], atribuição Dê p.
- Para a primeira linha, se o endereço inicial de p for 1000, assumindo que int ocupa 4 bytes, então após a execução de p ++, o endereço de p é 1000 + 4, e na terceira linha, se o endereço inicial de p é 1000, após realizar p ++, o valor de p é 1000 + 4 * 3, e assim por diante, o valor de p após p ++ na quarta linha é 1000 + 4 * 4 * 5.