Resumo do conhecimento de array de objetos dinâmicos C ++

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 Pointponteiros, 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.

Acho que você gosta

Origin blog.csdn.net/u012397189/article/details/78784928
Recomendado
Clasificación