Espaços nominais
Variantes
Acções

Classes

Da cppreference.com
< cpp‎ | language
 
 
 
 

Uma classe é um tipo definido por usuário.

Um tipo de classe é definidor por class-specifier/especificador-de-classe, que aparece em decl-specifier-seq da sintaxe de declaração. O class specifier tem a seguinte sintaxe:

class-key attr class-head-name { member-specification } (1)
class-key attr class-head-name : base-specifier-list { member-specification } (2)
class-key - uma de class, struct, union
attr(C++11) - sequência opcional de qualquer número de atributos
class-head-name - o nome da classe que está sendo definida. Opcionalmente prependida por nested-name-specifier (sequência de nomes e operadores scope-resolution/resolução-de-escopo, terminando com operador scope-resolution), opcionalmente seguida por palavra chave final. O nome pode ser omitido, em tal caso a classe é não-nomeada (note que classe não-nomeada não pode ser final)
base-specifier-list - lista de uma u mais classes mães e o modelo de herança usado para cada (veja classe derivada)
member-specification - lista de especificadores de accesso, declarações e definições de objeto membro e de função membro (veja definição de classe)

As class keys/chaves de classe struct e class são indistinguíveis em C++, exceto que o modo de acesso default e modo de herança default são public se declaração de classe usa a class-key struct e private se a declaração de classe usa a class-key class. Ambas class e struct podem ser usadas numa definição de classe.

O uso da chave de classe union resulta numa definição de união, que define uma classe que segura só um de seus membros de dados por vez.

Uma classe pode ter os seguintes tipos de members

1) membros de dados
2) funções membros
3) tipos ninhados
a) classes ninhadas e enumerações definidas dentro da definição de classe
b) aliases de tipos existentes, definidos com declarações de typedef ou alias de tipo (desde C++11)
c) o nome da classe dentro de sua própria definição age como um alias de tipo de membro público de si mesmo para o propósito de busca (exceto quando usado para nomear um construtor): isto é conhecido como injected-class-name/nome-de-classe-injetado
4) enumeradores de todas as enumerações não-escopadas dentro da classe, ou introduzidos por using-declarations/declarações using ou using-enum-declarations/declarações-using-enum (desde C++20)
5) templates membros (templates de variáveis, (desde C++14)templates de classe ou templates de função) podem aparecer no corpo de qualquer class/struct/union não-local.

Todos os membros são definidos de vez na definição de classe, eles não podem ser adicionado a uma classe já definida (ao contrário dos membros de namespaces)

Um membros de uma classe T não pode usar T como seu nome se o membro é um membro de dado estático, uma função membro, um tipo membro, um template membro , um enumerador de uma enumeração não-escopada, um membro de uma união anônima membro. Porém, um membro de dados não-estático pode usar o nome T contanto que não haja construtores declarados por usuário.

Uma classe com pelo menos uma função membro virtual declarada ou herdada é polimórfica. Objetos deste tipo são objetos polimórficos e têm informação de tipo de tempo de execução armazenada como parte da representação de objeto, que pode ser pesquisada com dynamic_cast e typeid. Funções de membro virtual participam em binding dinâmico.

Uma classe com pelo menos uma função membro virtual pura declarada ou herdade é uma classe abstrata. Objetos deste tipo não podem ser criados.

Uma classe com um construtor constexpr é um LiteralType: objetos deste tipo podem ser manipulados por funções constexpr a tempo de compilação functions.


(desde C++11)

Algumas funções membros são especiais: sob certas circunstâncias elas são definidas pelo compilador mesmo se não definidas pelo usuáio. Elas são:


(desde C++11)


(desde C++11)