Classe ou estrutura em C++: o debate eterno
\n\nImagine a situação: você está escrevendo código em C++ e precisa criar um novo tipo de dado. Imediatamente surge a pergunta na sua cabeça: «Quando devo usar class e quando devo usar struct?». Essa pergunta atormenta não apenas iniciantes — no Stack Overflow, ela acumulou milhares de visualizações e dezenas de discussões acaloradas. E não é surpresa: afinal, em C++, essas duas palavras-chave, à primeira vista, fazem a mesma coisa, mas com nuances.
\n\nNeste artigo, vamos entender de uma vez por todas qual é a diferença real entre class e struct, quando escolher cada um e como não cometer erros. Vamos lá!
Principal diferença: modificadores de acesso padrão
\n\nSe você pensa que class e struct são entidades completamente diferentes, está enganado. Em C++, a única diferença fundamental entre eles é o modificador de acesso padrão:
- \n
- struct: todos os membros (campos e métodos) são
publicpor padrão. \n - class: todos os membros são
privatepor padrão. \n
É só isso. Não há mais diferenças no nível da linguagem. Nem desempenho, nem mágica. Apenas acessibilidade. Vamos ver com exemplos como isso funciona.
\n\nExemplo com struct
\nstruct Point {\n int x;\n int y;\n};\n\n// Pode acessar diretamente\nPoint p;\np.x = 10;\np.y = 20;\n\nExemplo com class
\nclass Point {\n int x; // private por padrão!\n int y;\npublic:\n void setX(int val) { x = val; }\n void setY(int val) { y = val; }\n};\n\nPoint p;\n// p.x = 10; // Erro! x é private\np.setX(10); // Assim funciona\n\nComo você pode ver, a diferença está apenas em como você "esconde" os dados por padrão. Mas isso não significa que a escolha entre class e struct seja uma questão de gosto. Existem práticas estabelecidas.
\n\nQuando escolher struct?
\n\nNa comunidade C++, existe um consenso não oficial: struct é para dados simples. Use struct quando seu tipo é apenas um conjunto de campos públicos sem lógica complexa. Exemplos clássicos:
\n\n- \n
- Coordenadas de um ponto (
x, y) \n - Cor em RGB (
r, g, b) \n - Configuração (
width, height, title) \n - Resultado de uma operação (
success, errorMessage) \n
Nesses casos, não há necessidade de esconder os dados — eles já são públicos. struct torna o código mais limpo e mais curto. Além disso, struct é ideal para tipos POD (Plain Old Data) — estruturas que podem ser copiadas com um simples memcpy.
Exemplo de uso correto de struct
\nstruct Vector2 {\n float x;\n float y;\n \n // Pode adicionar métodos simples\n float length() const {\n return std::sqrt(x*x + y*y);\n }\n};\n\n// Usamos como um contêiner de dados simples\nVector2 v = {3.0f, 4.0f};\nstd::cout << v.length(); // 5.0\n\nObserve: mesmo que struct tenha métodos, isso é normal. O importante é que os campos permaneçam públicos e o tipo não exija lógica de invariante complexa.
Quando escolher class?
\n\nClass é a escolha padrão para objetos completos. Use class quando:
- \n
- Você tem lógica complexa que exige encapsulamento. \n
- Você quer controlar rigidamente como os dados são modificados. \n
- Seu tipo possui invariantes (por exemplo, "a idade não pode ser negativa"). \n
- Você usa herança, funções virtuais, polimorfismo. \n
Um exemplo clássico é a classe "Conta Bancária". O saldo não deve ser público, caso contrário, alguém pode acidentalmente definir um valor negativo.
\n\nExemplo de uso correto de class
\nclass BankAccount {\nprivate:\n double balance;\n std::string owner;\n \npublic:\n BankAccount(const std::stri