Diferença entre struct e class

1,059 views
Skip to first unread message

psantos

unread,
Oct 14, 2011, 10:38:33 PM10/14/11
to ccppbrasil
Olá Pessoal,

Pelo que vi pesquisando alguns sites no Google, uma das difereças
entre struct e class em C++ seria somente que na struct os métodos/
atributos são públicos por default e na class, privados.

Comprovei tal afirmação com o exemplo abaixo:

#include <iostream>
struct StructExample
{
std::string scope;
};

int main()
{

StructExample test;

test.scope = "public";

std::cout << test.scope;

std::cin >> test.scope;
return 0;

}

Quando eu uso struct, a saída é "public", mas quando troco a palavra
struct por class o erro abaixo é gerado:

..\untitled\main.cpp:4: error: 'std::string StructExample::scope' is
private

Existe mais alguma diferença entre class e struct?

Até mais!

Felipe Magno de Almeida

unread,
Oct 14, 2011, 10:42:50 PM10/14/11
to ccppb...@googlegroups.com
2011/10/14 psantos <pauloe...@gmail.com>:

> Olá Pessoal,
>
> Pelo que vi pesquisando alguns sites no Google, uma das difereças
> entre struct e class em C++ seria somente que na struct os métodos/
> atributos são públicos por default e na class, privados.

Bom, eu prefiro usar a nomenclatura "oficial" de variáveis-membro
e funções-membro. Complementando, também são publicas as bases
usando struct.

[snip]

> Existe mais alguma diferença entre class e struct?

Structs podem ser PODs (Plain-Old-Data) enquanto "class"es não
se estiverem de acordo com um conjunto de regras especificado no
padrão. No C++11 esse conjunto de regras é menos estrito.

> Até mais!
>
> --

[]'s
--
Felipe Magno de Almeida

Paulo Patto

unread,
Oct 14, 2011, 11:04:34 PM10/14/11
to ccppb...@googlegroups.com

Mas isso so funciona assim se vc compila com o g++ não? Gcc puro não rola né?

Paulo Patto;
enviado de um celular Android, desconsiderar erros.

--
Antes de enviar um e-mail para o grupo leia:
                    http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:
                       http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en

Oberlan

unread,
Oct 14, 2011, 11:37:00 PM10/14/11
to ccppb...@googlegroups.com
Outra diferença, é que em classe existe um construtor e destrutor, que são chamados automaticamente. Com struct, você teria que criar métodos para isso. 

Como você mesmo citou, em classe os atributos/métodos são, por default, privados. Por isso, quando você troca o "struct" por "class" dá erro. Já que std::string scope; será private (por default). Para resolver isso, adicione public antes da declaração de scope, ficando dessa forma:

class StructExample
{
public:
    std::string scope;
};


Oberlan

Rodrigo Madera

unread,
Oct 15, 2011, 1:08:09 AM10/15/11
to ccppb...@googlegroups.com
Galera,

Parem de viajar na batatinha.

Rodrigo (a.k.a. Skhaz)

unread,
Oct 15, 2011, 1:13:13 AM10/15/11
to ccppb...@googlegroups.com
2011/10/15 Rodrigo Madera <rodrigo...@gmail.com>:

Agree. nada que um reinterpret_cast não faça.

--
http://github.com/skhaz
http://wintermoon.sourceforge.net/
http://twitter.com/#!/rdelduca

Felipe Magno de Almeida

unread,
Oct 15, 2011, 1:14:45 AM10/15/11
to ccppb...@googlegroups.com
On Sat, Oct 15, 2011 at 2:13 AM, Rodrigo (a.k.a. Skhaz)
<rodrigo...@gmail.com> wrote:
> 2011/10/15 Rodrigo Madera <rodrigo...@gmail.com>:
>> Galera,
>> Parem de viajar na batatinha.
>> http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.9
>
> Agree. nada que um reinterpret_cast não faça.

Yuck!

Lucas Nunes

unread,
Oct 15, 2011, 11:34:08 AM10/15/11
to ccppb...@googlegroups.com
Eu considero o uso de struct em C++ (não C) inadequado. Uma vez que se pode usar class.
Agora as diferenças eu sempre quis saber...
Alguém discorda?

Thiago Sonego Goulart

unread,
Oct 15, 2011, 11:41:29 AM10/15/11
to ccppb...@googlegroups.com
On Sat, Oct 15, 2011 at 12:34 PM, Lucas Nunes <lucas...@gmail.com> wrote:
Eu considero o uso de struct em C++ (não C) inadequado. Uma vez que se pode usar class.
Agora as diferenças eu sempre quis saber...
Alguém discorda?

Eu! =)

A diferença é muito bem explicada no link do Rodrigo Madera. Qualquer outro argumento é puro sentimentalismo.

--
Thiago Sonego Goulart

Felipe Magno de Almeida

unread,
Oct 15, 2011, 1:06:30 PM10/15/11
to ccppb...@googlegroups.com
On Sat, Oct 15, 2011 at 12:34 PM, Lucas Nunes <lucas...@gmail.com> wrote:
> Eu considero o uso de struct em C++ (não C) inadequado. Uma vez que se pode
> usar class.
> Agora as diferenças eu sempre quis saber...
> Alguém discorda?

Sim, e uso quase exclusivamente struct em código C++.

Thiago Adams

unread,
Oct 15, 2011, 4:03:46 PM10/15/11
to ccppbrasil

On Oct 15, 2:06 pm, Felipe Magno de Almeida
<felipe.m.alme...@gmail.com> wrote:
> On Sat, Oct 15, 2011 at 12:34 PM, Lucas Nunes <lucasnun...@gmail.com> wrote:
> > Eu considero o uso de struct em C++ (não C) inadequado. Uma vez que se pode
> > usar class.
> > Agora as diferenças eu sempre quis saber...
> > Alguém discorda?
>

> Sim, e uso quase exclusivamente struct em código C++.
Algum motivo particular?

O que tenho visto é exatamente o que diz na FAQ:

"Emotionally, most developers make a strong distinction between a
class and a struct. A struct simply feels like an open pile of bits
with very little in the way of encapsulation or functionality. A class
feels like a living and responsible member of society with intelligent
services, a strong encapsulation barrier, and a well defined
interface. "

Lucas Nunes

unread,
Oct 15, 2011, 4:07:36 PM10/15/11
to ccppb...@googlegroups.com
Pessoal... eu li o link lá e não entendi muito bem... ^^"
Eu continuo com a filosofia do C++ = class e C = struct.
Por exemplo, por que eu deixaria de usar class para usar struct em C++?

Thiago Sonego Goulart

unread,
Oct 15, 2011, 4:19:42 PM10/15/11
to ccppb...@googlegroups.com

2011/10/15 Lucas Nunes <lucas...@gmail.com>

Pessoal... eu li o link lá e não entendi muito bem... ^^"
Eu continuo com a filosofia do C++ = class e C = struct.
Por exemplo, por que eu deixaria de usar class para usar struct em C++?

Preguiça de colocar o "public:" na primeira linha da declaração de uma class, talvez? Cara, a diferença é somente essa:

"The members and base classes of a struct are public by default, while in class, they default to private."
"struct and class are otherwise functionally equivalent."

--
Thiago Sonego Goulart

Thiago Adams

unread,
Oct 15, 2011, 4:39:53 PM10/15/11
to ccppbrasil


On Oct 15, 5:07 pm, Lucas Nunes <lucasnun...@gmail.com> wrote:
> Pessoal... eu li o link lá e não entendi muito bem... ^^"
> Eu continuo com a filosofia do C++ = class e C = struct.
> Por exemplo, por que eu deixaria de usar class para usar struct em C++?

O link, assim como qualquer referencia de c++, explica que não existe
diferença
entre usar class ou struct no c++, a não ser que em struct todos os
membros
são publicos por padrão enquanto que class todos os membros são
privates por padrão.

class { int x; }; //x é private aqui
struct { int x; }; //x é publico aqui

Existindo a opção, os programadores usam os mais diversos critérios
para incluir algum
significado no código quando usarem struct ou class.
Por exemplo, para algo que se pareça com struct do C , eles preferem
deixar struct. Outras classes
com constructor (que não existe no C) preferem deixar class.


Eu costumo usar um pouco dos dois. Quando coloco alguma coisa aqui no
grupo
dou a preferência para colocar o mínimo de texto e neste critério
struct as vezes ganha.
(Para interfaces aonde tudo seja publico e virtual eu uso struct tb)

-x-

Esta semelhança entre dois modos de escrever existe também com class e
typename dentro de templates.
void template<class T> f()...
void template<typename T> f) ...

Outro são as funções estáticas dentro da unidade de compilação

static void f() {}
ou
namespace {
void f() {}
}





Rafael Giusti

unread,
Oct 17, 2011, 9:17:06 AM10/17/11
to ccppb...@googlegroups.com
Essa não é uma questão de outro mundo. Você pode escolher usar struct ou class no momento em que achar mais conveniente, dependendo da visibilidade que você quer para os atributos. Mas no meu conceito de mundo ideal, partindo do princípio que seu código deveria ser o mais legível e claro possível, se o seu tipo de dados exerce o papel de classe (no sentido de representar uma entidade que possui dados e ações), você deveria usar class. Se tudo o que você quer é agrupar um conjunto de dados correlacionados em algum conceito (apenas dados, não ações), use struct.

tl;dr: é conceitualmente uma classe (POO)? class : struct.   //  =p

2011/10/15 Thiago Adams <thiago...@gmail.com>
}





--
Antes de enviar um e-mail para o grupo leia:
                    http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
             para Eventos do Grupo C & C++ Brasil:
                       http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira:  vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en



--
Rafael Giusti


Winston Pacheco Junior

unread,
Oct 17, 2011, 10:30:46 AM10/17/11
to ccppb...@googlegroups.com
Engraçado essa discussão...
Eu não sou programador C++, só acompanho a lista porque gosto de ver as dúvidas que as pessoas tem. Mas vamos lá.
Do que eu entendo um Struct normalmente e usado para ser uma estrutura de dados (podem existir ações, desde que elas só reflitam na própria estrutura de dados, ao meu ver) e uma classe quando você tem estado e ações. Mas no caso do C# e no Java também, salvo engano, vai um pouco além disso.
Não é necessário, por exemplo, construir uma estrutura de dados usando um alocador de memória, coisas do tipo [ Struct struct = new Struct() ] porque não existe uma estrutura de dados nula (sem você usar de artificios como nullable types em .net e em java eles recontroem os tipos primitivos como classes Wrapper para poder aceitar nulos, por exemplo, int é encapsulado por Integer onde int é um struct e Integer uma classe), você pode inicializa-la diretamente ou apenas declara-la e ela assumirá um valor default. Em [ int numero; ] o valor default dela é 0 ou em [ bool ehCerto; ] o valor default seria false. Além disso os Structs são por default passados por valor para outro método, enquanto as classes são passadas por referência, seria como se no C++ toda classe fosse passada como um ponteiro pra memória e todo struct fosse passado diretamente o valor.
Não existe esse tipo de coisa em C++? Posso ter explicado errado também, mas é como eu enxergo um Struct e uma Class.

Thiago Adams

unread,
Oct 17, 2011, 11:57:04 AM10/17/11
to ccppbrasil
On Oct 17, 12:30 pm, Winston Pacheco Junior
<winston.pach...@gmail.com> wrote:
> Engraçado essa discussão...
> Eu não sou programador C++, só acompanho a lista porque gosto de ver as
> dúvidas que as pessoas tem. Mas vamos lá.
> Do que eu entendo um Struct normalmente e usado para ser uma estrutura de
> dados (podem existir ações, desde que elas só reflitam na própria estrutura
> de dados, ao meu ver) e uma classe quando você tem estado e ações. Mas no
> caso do C# e no Java também, salvo engano, vai um pouco além disso.
> Não é necessário, por exemplo, construir uma estrutura de dados usando um
> alocador de memória, coisas do tipo [ Struct struct = new Struct() ] porque
> não existe uma estrutura de dados nula (sem você usar de artificios como
> nullable types em .net e em java eles recontroem os tipos primitivos como
> classes Wrapper para poder aceitar nulos, por exemplo, int é encapsulado por
> Integer onde int é um struct e Integer uma classe), você pode inicializa-la
> diretamente ou apenas declara-la e ela assumirá um valor default. Em [ int
> numero; ] o valor default dela é 0 ou em [ bool ehCerto; ] o valor default
> seria false. Além disso os Structs são por default passados por valor para
> outro método, enquanto as classes são passadas por referência, seria como se
> no C++ toda classe fosse passada como um ponteiro pra memória e todo struct
> fosse passado diretamente o valor.

> Não existe esse tipo de coisa em C++? Posso ter explicado errado também, mas
> é como eu enxergo um Struct e uma Class.

No C++, quando não é usado ponteiro ou referencia é tudo por cópia.
Não faz diferença se é struct ou class.

Tipo x;
Tipo y;
x = y; //copia

void f(Tipo x) {} //copia x

Tipo x;
Tipo& y = x; //referencia (nao tem copia)

void f(Tipo& x) {} //referencia

Só que referencia no C++ tem que ser gerenciada manualmente. Voce
precisa garantir que o objeto está vivo. Existem padrões de código
para isso.

Michel Braz de Morais

unread,
Oct 17, 2011, 12:07:00 PM10/17/11
to ccppb...@googlegroups.com
pessoal .
Alguem ja viu falar que struct é alocado em um lugar da pilha (stack) que é mais rápido o acesso do que quando se aloca uma classe?? (coisa assim)....
Um tempo atraz meus amigos e eu estávamos justamente discutindo isso!!






Thiago Adams

unread,
Oct 17, 2011, 12:15:28 PM10/17/11
to ccppbrasil
On Oct 17, 2:07 pm, Michel Braz de Morais
<michel.braz.mor...@gmail.com> wrote:
> pessoal .
> Alguem ja viu falar que struct é alocado em um lugar da pilha (stack) que é
> mais rápido o acesso do que quando se aloca uma classe?? (coisa assim)....
> Um tempo atraz meus amigos e eu estávamos justamente discutindo isso!!

No C++ não faz diferença se é struct ou class e a definição da classe
não sabe aonde ela será alocada.

O que é instânciado em um escopo de função está na pilha, o que é
alocado com new está no heap. E a criação do objeto na pilha é bem
mais rápida.

Eu diria que isso tem um profundo impacto no design do C++.

Rodrigo (a.k.a. Skhaz)

unread,
Oct 17, 2011, 12:37:41 PM10/17/11
to ccppb...@googlegroups.com
2011/10/17 Thiago Adams <thiago...@gmail.com>:

Só mais um detalhe, o tamanho da pilha é bem limitado, se o objeto for
muito grande o compilador vai alocar na heap, dependendo das flags
usadas na compilação é claro.

> Eu diria que isso tem um profundo impacto no design do C++.
>

> --
> Antes de enviar um e-mail para o grupo leia:
>                     http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
> --~--~---------~--~----~---------------------------------~----------~--~----~
> [&] Colabore com a Pesquisa de Preferência de Conteúdo
>              para Eventos do Grupo C & C++ Brasil:
>                        http://www.surveymonkey.com/s/GBBGTXN
> ------~----~-------~---~---~---~---~----------------~------------~---------~
> [&] C & C++ Brasil - http://www.ccppbrasil.org/
> Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
> Para mais opções, visite http://groups.google.com/group/ccppbrasil
> --~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
> Emprego & carreira:  vag...@ccppbrasil.org
> http://groups.google.com/group/dev-guys?hl=en
>

--

André Rairan

unread,
Oct 17, 2011, 12:42:21 PM10/17/11
to ccppb...@googlegroups.com
Nos embarcados heap é um pouco caro quanto a memória…
E para alguns padrões de programação, como MISRA não é uma boa prática, mas ai já entra uma outra discussão.

Rodrigo Magalhães

unread,
Oct 17, 2011, 12:44:16 PM10/17/11
to ccppb...@googlegroups.com
Michel, sobre esse comportamento que mencionou, ocorre algo semelhante é no C#. Segue um link que menciona essas diferenças:
 
 
Não sei precisar se essa é uma característica do C# apenas, ou se é uma característica da própria common language runtime.
 
Abraços,
Rodrigo.
 

 
2011/10/17 Michel Braz de Morais <michel.br...@gmail.com>
Reply all
Reply to author
Forward
0 new messages