Pergunta

Esta questão foi já perguntei no contexto de C#/.Net.

Agora eu gostaria de saber as diferenças entre uma estrutura e de uma classe em C++.Por favor, discuta as diferenças técnicas, bem como as razões para a escolha de um ou outro em design OO.

Vou começar com uma diferença óbvia:

  • Se você não especificar public: ou private:, membros de uma struct são públicos por padrão;os membros de uma classe são privados por padrão.

Eu tenho certeza que existem outras diferenças que podem ser encontrados no obscuros cantos da especificação de C++.

Foi útil?

Solução

Você esquece o 2º diferença complicado entre classes e estruturas.

Disse o padrão (§11.2.2 em C ++ 98 ++ 11 até C):

Na ausência de um acesso em especificador para uma classe base, público é assumido quando a classe derivada é declarada struct e privado é assumida quando a classe é declarada class .

E apenas Para ser completo, a diferença mais conhecido entre classe e struct é definido em (11.2):

Membro de uma classe definida com o palavra-chave class privada por padrão. Os membros de uma classe definida com as palavras-chave struct ou união são público , por padrão.

diferença adicionais:. A palavra-chave class pode ser usado para parâmetros de modelo de declaração, enquanto que a palavra-chave struct não pode ser tão acostumados

Outras dicas

O C ++ FAQ ,

[7.8] Qual é a diferença entre as palavras-chave struct e classe?

Os membros e classes de base de um struct são públicos por padrão, enquanto que em classe, eles padrão como privado. Nota: você deve fazer suas classes base explicitamente público, privado, ou protegido, em vez de confiar na defaults.

Struct e classe são de outra maneira funcionalmente equivalente.

OK, chega disso completamente limpa techno falar. Emocionalmente, a maioria desenvolvedores fazer uma distinção forte entre uma classe e um struct. UMA struct simplesmente se sente como uma pilha aberto de bits com muito pouco na maneira de encapsulamento ou funcionalidade. UMA sente classe como a vida e membro responsável da sociedade com serviços inteligentes, uma forte barreira de encapsulamento, e um poço interface definida. Já que é a conotação maioria das pessoas já têm, você provavelmente deve usar o struct palavra-chave se você tiver uma classe que tem muito poucos métodos e tem dados públicos (Essas coisas existem em bem desenhado sistemas!), mas caso contrário, você deve provavelmente usar a palavra-chave classe.

Vale a pena lembrar C ++ 's origens na, e compatibilidade com, C.

C tem estruturas, não tem nenhum conceito de encapsulamento, então tudo é público.

Ser públicos por padrão é geralmente considerado uma má idéia quando se toma uma abordagem orientada a objeto, de modo a fazer uma forma de C que é nativamente propício à OOP (você pode fazer OO em C, mas não vai ajudá-lo) que era a idéia em C ++ (originalmente "C com Classes"), faz sentido para fazer os membros privados por padrão.

compatibilidade

Por outro lado, se Stroustrup tinha mudado a semântica de struct para que seus membros eram privados por padrão, ele teria quebrado (que já não é o mais verdadeiro como as normas divergiram, mas todos os programas em C válido também foram válida C ++ programas, que teve um grande efeito sobre dando C ++ um ponto de apoio).

Assim, uma nova palavra-chave, class foi introduzido para ser exatamente como um struct, mas privados por padrão.

Se C ++ tinha chegado a partir do zero, sem história, em seguida, ele provavelmente teria apenas uma dessas palavras-chave. Ele também provavelmente não teria feito o impacto que fez.

Em geral, as pessoas tendem a usar struct quando eles estão fazendo algo parecido como estruturas são usadas em C; membros públicos, nenhum construtor (contanto que ele não está em uma união, você pode ter construtores em estruturas, assim como com as classes, mas as pessoas tendem a não), há métodos virtuais, etc. Desde línguas são tanto para se comunicar com as pessoas lendo o código como a máquinas Instrua (ou então que ia ficar com montagem e opcodes VM-primas) é uma boa idéia para ficar com isso.

Os membros da classe são privados por padrão. membros de struct são públicos por padrão. Além de que não existem outras diferenças. Veja também esta questão .

De acordo com Stroustrup no C ++ Linguagem de programação :

Qual o estilo que você usa depende de circunstâncias e gosto. I geralmente preferem usar struct para as classes que têm todos os públicos de dados. Eu acho que essas classes como "tipos não muito adequadas, estruturas de dados apenas."

Funcionalmente, não há diferença diferente do público / privado

STRUCT é um tipo de Abstract tipo de dados que divide um determinado pedaço de memória de acordo com a especificação de estrutura. Estruturas são particularmente úteis no arquivo de serialização / desserialização como a estrutura muitas vezes pode ser escrito para o arquivo na íntegra. (Isto é, obter um ponteiro para a estrutura, utilizar a macro TAMANHO para calcular o número de bytes a ser transferido, em seguida, mover os dados dentro ou para fora da estrutura.)

As aulas são um tipo diferente de tipo de dados abstrato que tentam garantir ocultação de informações. Internamente, pode haver uma variedade de maquinações, métodos, variáveis ??temporárias, variáveis ??de estado. etc, que são usados ??para apresentar uma API consistente para qualquer código que deseje usar a classe.

Com efeito, estruturas estão sobre os dados, as aulas são sobre o código.

No entanto, você precisa entender que estes são apenas abstrações. É perfeitamente possível criar estruturas que se parecem muito com as classes e classes que parecem muito com estruturas. Na verdade, os compiladores mais antigos C ++ foram meramente pré-compiladores que traduz o código C ++ a C. Assim, essas abstrações são um benefício para o pensamento lógico, não necessariamente uma mais valia para o próprio computador.

Para além do facto de que cada um é um tipo diferente de abstracção, Classes de proporcionar soluções para o quebra-cabeça de nomenclatura código C. Desde que você não pode ter mais de uma função exposta com o mesmo nome, os desenvolvedores usado a seguir um padrão de _ (). por exemplo. mathlibextreme_max (). Ao agrupar APIs em classes, funções semelhantes (aqui vamos chamá-los de "métodos") podem ser agrupados e protegidos contra a nomeação de métodos em outras classes. Isso permite que o programador para organizar seu código melhor e aumentar a reutilização de código. Em teoria, pelo menos.

1) Os membros de uma classe são privados por padrão e membros de struct são públicos por padrão.

Por exemplo programa 1 falha na compilação e um programa de 2 funciona bem.

// Program 1
#include <stdio.h>

class Test {
    int x; // x is private
};
int main()
{
  Test t;
  t.x = 20; // compiler error because x is private
  getchar();
  return 0;
}
Run on IDE
// Program 2
#include <stdio.h>

struct Test {
    int x; // x is public
};
int main()
{
  Test t;
  t.x = 20; // works fine because x is public
  getchar();
  return 0;
}

2) Ao derivar uma estrutura de uma classe / struct, padrão acesso de especificador para uma classe base / struct é público. E quando derivando uma classe, de acesso padrão especificador é privado.

Por exemplo programa 3 falha na compilação e um programa de 4 funciona bem.

// Program 3
#include <stdio.h>

class Base {
public:
    int x;
};

class Derived : Base { }; // is equilalent to class Derived : private Base {}

int main()
{
  Derived d;
  d.x = 20; // compiler error becuase inheritance is private
  getchar();
  return 0;
}
Run on IDE
// Program 4
#include <stdio.h>

class Base {
public:
    int x;
};

struct Derived : Base { }; // is equilalent to struct Derived : public Base {}

int main()
{
  Derived d;
  d.x = 20; // works fine becuase inheritance is public
  getchar();
  return 0;
}

A única outra diferença é a herança padrão de classes e estruturas, que, sem surpresa, é privado e público, respectivamente.

Nem na especificação, não. A principal diferença está na expectativa programador quando lêem o seu código em 2 anos. estruturas são muitas vezes assumido como POD. Estruturas também são usados ??em modelo metaprogramming quando você está definindo um tipo para outros do que a definição de objetos fins.

Uma outra coisa a nota, se você atualizou um aplicativo legado que tinha estruturas para usar as classes que você pode correr para o seguinte problema:

código Velho tem estruturas, o código foi limpo e estes alterado para classes. A função virtual ou duas foi então adicionada à nova classe atualizado.

Quando as funções virtuais estão em aulas, em seguida, internamente o compilador irá adicionar ponteiro extra para os dados de classe para apontar para as funções.

Como isso iria quebrar o código legado velho é se no código velho em algum lugar a estrutura foi limpa usando memfill para limpar tudo a zeros, isso iria pisar os dados ponteiro extras também.

  1. Os membros de uma estrutura são públicos por padrão, os membros da classe são privados por padrão.
  2. herança padrão para Estrutura de outra estrutura ou classe é public.Default herança para a classe de outra estrutura ou classe é privado.
class A{    
public:    
    int i;      
};

class A2:A{    
};

struct A3:A{    
};


struct abc{    
    int i;
};

struct abc2:abc{    
};

class abc3:abc{
};


int _tmain(int argc, _TCHAR* argv[])
{    
    abc2 objabc;
    objabc.i = 10;

    A3 ob;
    ob.i = 10;

    //A2 obja; //privately inherited
    //obja.i = 10;

    //abc3 obss;
    //obss.i = 10;
}

Esta é a VS2005.

Outra diferença principal é quando se trata de modelos. Tanto quanto eu sei, você pode usar uma classe quando você definir um modelo, mas não uma struct.

template<class T> // OK
template<struct T> // ERROR, struct not allowed here
  1. Membro de uma classe definida com a palavra chave class são private por padrão. Os membros de uma classe definida com o struct palavras-chave (ou union) são public por padrão.

  2. Na ausência de um acesso de especificador para uma classe base, public é assumido quando a derivada classe é declarada struct e private é assumido quando a classe é declarado class.

  3. Você pode declarar um enum class mas não um enum struct.

  4. Você pode usar template<class T> mas não template<struct T>.

Note-se também que o padrão C ++ permite encaminhar-declarar um tipo como um struct, e, em seguida, usar class quando declarar o tipo e vice-versa. Além disso, é std::is_class<Y>::value true por Y ser um struct e um class, mas é false para um enum class.

Aqui está uma boa explicação: http://carcino.gen.nz/tech /cpp/struct_vs_class.php

Assim, mais uma vez:. Em C ++, uma estrutura é idêntica a uma classe, exceto que os membros de uma struct têm visibilidade pública por padrão, mas os membros de uma classe ter visibilidade privados por padrão

É apenas uma convenção. Estruturas podem ser criadas para armazenar dados simples, mas mais tarde evoluir com a adição de funções de membro e construtores. Por outro lado, é raro ver outra coisa senão público:. Acesso em um struct

ISO IEC 14882-2003

9 Classes

§3

A estrutura é uma classe definida com class-chave struct; seus membros e classes de base (ponto 10) são públicos por padrão (cláusula 11).

As outras respostas mencionaram os padrões públicas / privadas, (mas note que um struct é uma classe é um struct, pois eles não são dois itens diferentes, apenas duas maneiras de definir o mesmo item).

O que poderia ser interessante para nota (particularmente desde que o consulente é provável que seja usando MSVC ++ desde que ele menciona "não gerenciado" C ++) é que o Visual C ++ reclama sob certas circunstâncias, se uma classe é declarada com class e, em seguida, definida com struct (ou possivelmente o contrário), embora o padrão diz que é perfeitamente legal.

  • . Nas aulas de todos os usuários por padrão são privados, mas na estrutura membros são públicos por padrão.

    1. Não há termo como construtor e destruidor de estruturas, mas para a classe compilador cria padrão, se você não fornecer.

    2. Sizeof estrutura vazia é 0 Bytes wer como Sizeof classe vazia é 1 Byte O tipo de acesso padrão struct é público. A estrutura deve tipicamente ser usado para o agrupamento de dados.

    O tipo de acesso padrão classe é privada, e o modo padrão para herança é privado. A classe deve ser usada para o agrupamento de dados e métodos que operam em que os dados.

    Em suma, a convenção é usar struct quando o objetivo é dados de grupo e classes de uso quando necessitam de abstração de dados e, talvez herança.

    estruturas e classes em C ++ são passados ??por valor, a menos que explicitamente de-referenciado. Em outras classes e estruturas podem ter outro idioma? semântica distintas - ie. objetos (instâncias de classes) pode ser passado por referência e as estruturas podem ser passados ??por valor. Nota: Existem comentários associados a esta pergunta. Veja a página de discussão para acrescentar à conversa.

Enquanto implícito por outras respostas, não é mencionado explicitamente - que estruturas são C compatível, dependendo do uso; classes não são.

Isto significa que se você está escrevendo um cabeçalho que você quer ser C compatível, em seguida, você não tem nenhuma outra do que struct (que no mundo do C não pode ter funções, mas pode ter ponteiros de função) opção.

A diferença entre class e struct uma diferença entre palavras-chave, não entre tipos de dados. Este dois

struct foo : foo_base { int x;};
class bar : bar_base { int x; };

tanto definir um tipo de classe. A diferença das palavras-chave neste contexto é diferente de acesso padrão:

  • foo::x é público e foo_base é herdada publicamente
  • bar::x é privado e bar_base é herdada privada

Class só tem sentido no contexto de engenharia de software. No contexto da estruturas de dados e algoritmos, classe e estrutura não são tão diferentes. Não há alguma regra restringe esse membro da classe deve ser referenciado.

Ao desenvolver projeto grande com toneladas de pessoas sem classe, você pode finalmente se complicado código acoplado porque uso todos quaisquer funções e dados que eles querem. classe fornece controles de permissão e inherents para melhorar a dissociação e reutilização de códigos.

Se você ler alguns princípios de engenharia de software, você vai encontrar a maioria das normas não pode ser implementada facilmente sem classe. por exemplo: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

BTW, quando uma estrutura aloca uma crise de memória e inclui diversas variáveis, variáveis ??do tipo valor indica que os valores são embbeded em onde struct é alocado. Em contraste, os valores de variáveis ??Tipo de referência são externa e de referência por um ponteiro que também está incorporado na estrutura onde é alocado.

Você pode considerar este para obter orientações sobre quando ir para a estrutura ou classe, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

v considerar a definição de uma estrutura em vez de uma classe se instâncias do tipo são pequenos e normalmente de curta duração ou são comumente incorporados em outros objetos.

X evitar definir uma estrutura menos que o tipo tem todas as seguintes características:

É logicamente representa um valor único, semelhante aos tipos de primitivas (int, duas vezes, etc.).

Tem uma instância tamanho com menos de 16 bytes.

Ele é imutável.

Não terá de ser encaixotado freqüentemente.

A diferença entre struct e classe palavras-chave em C ++ é que, quando não há nenhuma especificador específica sobre o tipo particular de dados composto por padrão struct ou união é as palavras-chave públicas que apenas considera ocultamento de dados, mas classe é a palavra-chave privada que considera o esconderijo da códigos de programa ou dados. Sempre alguns programadores usam struct para dados e class por causa de código. Para mais informações contactar outras fontes.

Fora de todos esses fatores, pode-se concluir que o conceito de classe é altamente adequado para representar objetos do mundo real, em vez de "Estruturas" .Largely porque conceitos OOP usados ??em sala de aula são muito práticos para explicar cenários do mundo real, portanto, mais fácil de fundi-los para reality.For um exemplo, a herança padrão é pública para estruturas, mas se aplicarmos essa regra para o mundo real, é ridiculous.But em uma herança padrão classe é privada, que é mais realista.

De qualquer forma, o que eu preciso para justificar é de classe é, um conceito aplicável mundo real muito mais ampla enquanto Estrutura é um conceito primitivo com a organização interna pobres (Eventhough struct segue conceitos OOP, eles têm um significado pobres)

A principal diferença entre estrutura e palavra-chave classe em oops é que, não pública e membro privado declaração presentes em structure.and o membro de dados e função de membro pode ser definida como pública, privada, bem como protegido.

Eu encontrei uma outra diferença. se você não definir um construtor em uma classe, o compilador irá definir um. mas em um struct se você não definir um construtor, o compilador não definir um construtor também. por isso, em alguns casos que realmente não precisa de um construtor, struct é uma escolha melhor (dica de desempenho). e desculpe pelo meu mau Inglês.

Classes são tipos de Referência e Estruturas são tipos de Valores.
Quando eu digo Classes são tipos de referência,
basicamente, eles irão conter o endereço de uma variáveis de instância.

Por exemplo:

Class MyClass
{
    Public Int DataMember;  //By default, accessibility of class data members 
                            //will be private. So I am making it as Public which 
                            //can be accessed outside of the class.
}

No método main,
Eu posso criar uma instância dessa classe usando o operador new, que aloca memória para esta classe de
e armazena o endereço base do que em MyClass tipo de variável(_myClassObject2).

Static Public void Main (string[] arg)
{
    MyClass _myClassObject1 = new MyClass();
    _myClassObject1.DataMember = 10;

    MyClass _myClassObject2 = _myClassObject1;
    _myClassObject2.DataMember=20;
}

No programa acima, MyClass _myClassObject2 = _myClassObject1;instrução indica que ambas as variáveis do tipo MyClass

  1. myClassObject1
  2. myClassObject2

e irá apontar para o mesmo local da memória.
Basicamente, ele atribui a mesma localização de memória para outra variável do mesmo tipo.

Então, se quaisquer alterações que possamos fazer em qualquer um dos objetos tipo de MyClass terá um efeito sobre o outro
uma vez que ambos estão apontando para o mesmo local da memória.

"_myClassObject1.DataMember = 10;" nessa linha, tanto o objeto membros de dados irá conter o valor de 10.
"_myClassObject2.DataMember = 20;" nessa linha, tanto o membro de dados do objeto vai contém o valor 20.
Eventualmente, estamos acessando datamembers de um objeto através de ponteiros.

Ao contrário de classes, as estruturas são tipos de valor.Por exemplo:

Structure MyStructure
{
    Public Int DataMember;  //By default, accessibility of Structure data 
                            //members will be private. So I am making it as 
                            //Public which can be accessed out side of the structure.
}

Static Public void Main (string[] arg)
{
    MyStructure _myStructObject1 = new MyStructure();
    _myStructObject1.DataMember = 10;

    MyStructure _myStructObject2 = _myStructObject1;
    _myStructObject2.DataMember = 20;
}

No programa acima,
instanciar o objeto de MyStructure tipo usando o operador new e
armazenar o endereço em _myStructObject variável do tipo MyStructure e
atribuir o valor 10 à membro de dados da estrutura usando "_myStructObject1.DataMember = 10".

Na linha seguinte,
Eu estou declarando outra variável _myStructObject2 do tipo MyStructure e atribuindo _myStructObject1 em que.
Aqui .NET C# compilador cria uma cópia do objeto e _myStructureObject1
atribui-se que a memória local em MyStructure variável _myStructObject2.

Assim, qualquer alteração no _myStructObject1 nunca vai ter um efeito sobre outra variável _myStructObject2 do tipo MyStructrue.
É para isso que estamos dizendo Estruturas são tipos de valor.

Portanto, a imediata classe Base para a classe de objectos e imediata classe Base para a Estrutura é ValueType que herda de Object.
As aulas serão de suporte a Herança, enquanto que Estruturas não.

Como estamos dizendo isso?
E qual é a razão por trás disso?
A resposta é de Classes.

Ele pode ser abstrato, selado, estático, e parcial, e não pode ser Privada, Protegida e protegida interna.

A principal diferença entre struct e classe é que no struct você só pode declarar variáveis ??de diferentes tipos de dados de dados ao mesmo tempo em sala de aula você pode declarar variáveis ??de dados, funções de membro e, portanto, você pode manipular variáveis ??de dados através de funções.

-> outra coisa útil que eu encontrar na classe vs struct é que ao implementar arquivos em um programa, se você quiser fazer algumas operações de um struct uma e outra vez a cada novo conjunto de operações que você precisa para fazer uma função separada e você precisa passar objeto de struct após a leitura do arquivo de modo a fazer algumas operações sobre ele. enquanto que na classe, se você fizer uma função que faz algumas operações sobre os dados necessários everytime..its fácil você só tem que ler o objeto de arquivo e chamar a função ..

Mas depennds do programador para que lado ele / ela acha adequado ... segundo me prefiro classe toda vez que só porque ele suporta OOPs e isso é a razão pela qual ele é implementado em quase todas as línguas e sua a característica maravilhosa de todos os tempos programação; -)

E sim a diferença mais unforgotten eu esqueci de mencionar é que suporta a classe de dados escondendo e também suporta operações que são executadas em construído em tipos de dados, enquanto struct does not!

** UPDATE: ** Por favor, ignore esta resposta. Eu não considerar a possibilidade de que para a estrutura, o valor foi inicializado, mas só passou a ser 0. Não há uma diferença de inicialização entre o struct e classe.


Eu estou vendo outra diferente entre estruturas e classes que têm a ver com a inicialização padrão.

struct Foo {
    int a;
};

class Bar {
    int a;
};

class Tester {
    Foo m_Foo = Foo();
    Bar m_Bar = Bar();

public:
    Tester() {}
};

int main() {
    auto myTester = Tester();
}

Executar esse código e examinar myTester. Você vai descobrir que para m_Foo, a estrutura, m_Foo.a foi inicializado a 0, mas para m_Bar, a classe, m_Bar.a é não inicializado. Portanto, não parece haver uma diferença no que o construtor padrão faz para a classe struct vs.. Eu estou vendo isso com Visual Studio.

Existem 3 diferença básica entre estrutura e classe

memória 1º- são reservados para a estrutura em memória de pilha (que está perto de linguagem de programação) se para a classe em memória de pilha são reservados apenas para reffrence e memória real são reservados na memória heap.

. 2º - Ao tratar estrutura padrão como público se classe deleite como uma empresa privada

3ª ordem não pode voltar código -uso em estrutura, mas na classe podemos reutilizar mesmo código em muitos tempo chamado inhertence

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top