English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

C++ Atenção ao Usar new no Construtor

Os problemas encontrados ao usar new para inicializar o membro ponteiro do objeto

Ao usar new para inicializar o membro ponteiro no construtor, o destrutor deve usar delete, e new deve corresponder a delete, new[] deve corresponder a delete[].

Em casos de múltiplos construtores, deve-se usar new da mesma forma, ou usar new ou new[], pois há apenas um destrutor, todos os construtores devem ser compatíveis com o destrutor.

PS. Claro, ao inicializar ponteiros com new no construtor, você pode inicializar o ponteiro como vazio (0/NULL ou C++11nullptr), pois delete, com ou sem [], é compatível com ponteiros nulos.

É necessário definir manualmente um construtor de cópia e um construtor de atribuição, inicializar um objeto em outro objeto usando cópia profunda, como: uma cópia para outra, como mostrado a seguir:

Construtor de cópia:

  • Alocar espaço suficiente para armazenar os dados copiados
  • A cópia de dados não é apenas endereço
  • Atualizar os membros estáticos afetados
String:String(const String & st)
{
  num_Strings++;
  len = st.len;
  str = new char[len+1];
  std::strcpy(str, st.str);
}

Construtor de atribuição:

  • Verificar a situação de cópia de si mesmo
  • Liberar o ponteiro do membro antes de apontar para a memória
  • A cópia de dados não é apenas endereço
  • Retorna uma referência ao objeto chamado
String & String:operator=(const String & st)
{
  if(this == &st)
    return *this;
  else
    delete [] str;
    len = st.len;
    str = new char[len+1];
    std::strcpy(str, st.str);
  return *this;
}

Isso é tudo o que há no artigo, espero que o conteúdo deste artigo possa ajudar você a aprender ou trabalhar, e também espero que você dê mais apoio ao tutorial de gritaria!

Declaração: O conteúdo deste artigo é de propriedade da internet, pertence ao autor original, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w3Aviso: O conteúdo deste artigo foi extraído da internet, pertence ao autor original, o conteúdo foi contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade por questões legais relacionadas. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w

Você também pode gostar