Conteúdo verificado

C ++

Assuntos Relacionados: Programação de Computadores

Você sabia ...

Crianças SOS feita esta seleção Wikipedia ao lado de outras escolas recursos . Visite o site da SOS Children at http://www.soschildren.org/

C ++
C plus plus book.jpg
O C ++ Programming Language, escrito por seu arquiteto, é o livro seminal sobre a língua.
Paradigma (s) Multi-paradigma: processual, funcional, orientada a objetos, genérico
Apareceu em 1983
Projetado por Bjarne Stroustrup
Revelador
  • Bjarne Stroustrup
  • Bell Labs
  • ISO / IEC JTC1 / SC22 / WG21


Versão estável ISO / IEC 14882: 2011 (2011)
Disciplina Typing Estática, inseguro, nominativo
As principais implementações C ++ Builder, LLVM Clang, Comeau C / C ++, GCC, Intel C ++ Compiler, Microsoft Visual C ++, Sun Studio
Dialetos C ++ incorporado, Managed C ++, C ++ / CLI, C ++ / CX
Influenciado Perl , LPC, Lua, Pike, Ada 95, Java , PHP, D, C99, C #, Falcon, Seed7
OS Cruz-plataforma (multi-plataforma)
Usual extensões de arquivo .h .hh .hpp .hxx .h ++ .cc .cpp .cxx .c ++
  • Notícias, estatuto e discussão sobre o padrão C ++
  • Programação em C ++ em Wikibooks

C ++ (pronuncia-se "ver plus plus") é uma tipagem estática, de forma livre, multi-paradigma, compilado, para uso geral linguagem de programação . É considerado como uma linguagem de nível intermédio, uma vez que compreende tanto de alto nível e baixo nível de recursos de linguagem. Desenvolvido por Bjarne Stroustrup, a partir de 1979, Bell Labs, C ++ foi originalmente chamado C com Classes, acrescentando objeto recursos orientados, como aulas e outras melhorias para a linguagem de programação C . A linguagem C ++ foi rebatizado em 1983, como um trocadilho envolvendo a operador de incremento.

C ++ é uma das linguagens de programação mais populares e é implementada em uma ampla variedade de plataformas de hardware e sistema operacional. Como um compilador eficiente para código nativo, os seus domínios de aplicação incluem software de sistemas, aplicações de software de aplicativos, drivers de dispositivos, software embarcado, servidor e cliente de alto desempenho e software de entretenimento, como jogos de vídeo . Vários grupos fornecer tanto livres e proprietários C ++ software compilador, incluindo a GNU Project, Microsoft, Intel e Embarcadero Technologies. C ++ tem grandemente influenciado muitas outras linguagens de programação populares, mais notavelmente C # e Java . Outras línguas de sucesso, como Objective-C usar um muito diferente sintaxe e abordagem para adicionar classes para C .

C ++ também é usado para design de hardware, onde o projeto está descrito inicialmente em C ++, em seguida, analisados, arquitetonicamente constrangido, e programado para criar um Register Transfer Level descrição de hardware língua via síntese de alto nível.

A língua começou como melhorias para C , adicionando primeiro classes, em seguida, funções virtuais, sobrecarga de operadores, herança múltipla, modelos e manipulação de exceção, entre outras funcionalidades. Após anos de desenvolvimento, o padrão C ++ linguagem de programação foi ratificado em 1998 como ISO / IEC 14882 : 1998. O padrão foi alterado pela técnica 2003 rectificação, ISO / IEC 14882: 2003. O padrão atual se estende C ++ com novos recursos foi ratificado e publicado pela ISO em setembro de 2011 como ISO / IEC 14882 : 2011 (informalmente conhecido como C ++ 11).

História

Bjarne Stroustrup, criador do C ++

Bjarne Stroustrup, um cientista da computação treinados dinamarquês e britânico, começou seu trabalho em "C com Classes" em 1979. A ideia de criar uma nova linguagem se originou da experiência de Stroustrup na programação para o doutorado tese. Stroustrup descobriram que Simula tinha características que foram muito útil para o desenvolvimento de software de grande porte, mas a linguagem era muito lenta para uso prático, enquanto BCPL foi rápido, mas também de baixo nível para ser adequado para o desenvolvimento de software de grande porte. Quando Stroustrup começou a trabalhar em AT & T Bell Labs, ele teve o problema de analisar o UNIX com respeito ao núcleo computação distribuída. Lembrando seu Ph.D. experiência, Stroustrup definidos para melhorar a C linguagem com Simula-características semelhantes. C foi escolhida porque era de uso geral, rápido, portátil e amplamente utilizado. Além C e Simula, algumas outras línguas que o inspirou foram ALGOL 68, Ada, CLU e ML. Na primeira, a classe, classe derivada, tipagem forte, inline, e recursos argumento padrão foram adicionados a via C C ++ de Stroustrup para compilador C, Cfront. A primeira implementação comercial do C ++ foi lançado em 14 de Outubro de 1985.

Em 1983, o nome da linguagem foi alterada de C com classes de C ++ (++ sendo o operador de incremento em C). Novos recursos foram adicionados, incluindo funções virtuais, nome da função e sobrecarga de operadores, as referências constantes, controle controlado pelo usuário livre de armazenamento de memória, a melhoria da verificação de tipo e estilo BCPL de linha única comenta com duas barras ( // ). Em 1985, a primeira edição do O C ++ Programming Language foi lançado, proporcionando uma importante referência para a linguagem, como ainda não havia um padrão oficial. Versão 2.0 do C ++ veio em 1989 ea segunda edição atualizada do The C ++ Programming Language, foi lançado em 1991. Novos recursos incluídos herança múltipla, classes abstratas, funções de membro estático, funções de membro const, e membros protegidos. Em 1990, The Annotated C ++ Manual de Referência foi publicado. Este trabalho constituiu a base para a futura norma. Adições de recursos final incluído modelos, excepções, namespaces, novo lança, e uma Tipo boolean.

Tal como a linguagem C ++ evoluído, a biblioteca padrão evoluiu com ele. A primeira adição à biblioteca padrão do C ++ foi o stream de I / O biblioteca que forneceu instalações para substituir as funções tradicionais, como C printf e scanf. Mais tarde, entre as adições mais significativas para a biblioteca padrão, havia um grande quantidade do Template Library padrão.

C ++ é chamado às vezes uma linguagem híbrida.

É possível escrever orientada a objeto ou código processual no mesmo programa em C ++. Isto tem causado alguma preocupação de que alguns programadores C ++ ainda estão escrevendo código processual, mas estão sob a impressão de que ele é orientado a objeto, simplesmente porque eles estão usando C ++. Muitas vezes é uma amálgama dos dois. Isso geralmente faz com que a maioria dos problemas quando o código é revisitado ou a tarefa é adquirida por outra codificador.

C ++ continua a ser utilizada e é uma das linguagens de programação preferenciais para desenvolver aplicações profissionais.

Etimologia

De acordo com Stroustrup: "o nome significa a natureza evolutiva das mudanças de C". Durante o período de desenvolvimento do C ++, a língua tinha sido referido como "novo C", então "C com classes". O nome final é creditada a Rick Mascitti (meados de 1983) e foi usada pela primeira vez em dezembro de 1983. Quando foi questionado Mascitti informalmente em 1992 sobre a nomeação, ele indicou que foi dado em um espírito tongue-in-cheek. Ele deriva de "++" de C operador (que incrementa o de um valor variável) e uma comum convenção de nomenclatura de usar "+" para indicar um programa de computador avançado. Uma piada diz que o nome em si tem um erro: devido ao uso de pós -increment, que incrementa o valor da variável, mas avalia que o valor unincremented, C ++ não é melhor que C, e o pré-incremento ++ formulário C deveria ter sido utilizado em seu lugar. Não há linguagem chamada "C plus". ABCL / c + era o nome de uma linguagem de programação mais cedo, não relacionado. Algumas outras línguas foram nomeados de forma semelhante a C ++, mais notavelmente C-- e C #.

Estandardização

Ano C ++ Padrão Nome informal
1998 ISO / IEC 14882: 1998 C ++ 98
2003 ISO / IEC 14882: 2003 C ++ 03
2007 ISO / IEC TR 19768: 2007 C ++ TR1
2011 ISO / IEC 14882: 2011 C ++ 11

Em 1998, o C ++ comitê de padrões (o ISO / IEC JTC1 / SC22 / WG21 grupo de trabalho) C ++ padronizado e publicou a norma internacional ISO / IEC 14882: 1998 (informalmente conhecido como C ++ 98). Durante alguns anos após o lançamento oficial do padrão, a comissão processado relatórios de defeitos, e em 2003 publicou uma versão corrigida do C ++ padrão, ISO / IEC 14882: 2003. Em 2005, um relatório técnico, o chamado " Relatório da Biblioteca Técnica 1 "(muitas vezes conhecido como TR1 para o short), foi liberado. Embora não seja uma parte oficial do padrão, é especificado um número de extensões para a biblioteca padrão, que eram esperados para ser incluído na próxima versão do C ++.

A última grande revisão do padrão C ++, 11 C ++, (anteriormente conhecido como C ++ 0x) foi aprovado pela ISO / IEC em 12 de agosto de 2011. Ele foi publicado como 14882: 2011. Existem planos para um menor (C ++ 14) e uma revisão importante (C ++ 17) no futuro.

C ++ 14 é o nome a ser usado para a próxima revisão. C ++ 14 está planejada para ser uma pequena extensão sobre C ++ 11, caracterizando principalmente correções de bugs e pequenas melhorias, da mesma forma como C ++ 03 foi uma pequena extensão para C ++ 98. Embora o nome "C ++ 14 'implica uma liberação em 2014, esta data não é fixa.

Filosofia

Em O Projeto e Evolução do C ++ (1994), Bjarne Stroustrup descreve algumas regras que ele usou para o projeto de C ++:

  • C ++ é projetado para ser um estaticamente idioma digitado, de uso geral que é tão eficiente e portátil como C
  • C ++ é projetado para diretamente e de forma abrangente suporte a vários estilos de programação ( programação procedural, abstração de dados, programação orientada a objetos, e programação genérica)
  • C ++ é projetado para dar o escolha programador, mesmo que isto torna possível que o programador escolha incorrecta
  • C ++ é concebido para ser compatível com o C, tanto quanto possível, o que proporciona uma transição suave a partir de C
  • C ++ evita características que são plataforma específica ou finalidade não geral
  • C ++ não incorrerá sobrecarga para os recursos que não são utilizados (o "princípio de zero overhead")
  • C ++ é projetado para funcionar sem um ambiente de programação sofisticado

Dentro do C ++ Object Model (Lippman, 1996) descreve como compiladores pode converter programa C ++ declarações em um layout na memória. Compiler autores são, no entanto, livre para implementar o padrão em sua própria maneira.

Biblioteca padrão

A 1998 ANSI / ISO C ++ padrão consiste de duas partes: o linguagem núcleo ea Biblioteca C ++ Padrão; o último inclui a maior parte do Standard Template Library (STL) e uma versão ligeiramente modificada da biblioteca padrão C. Existem muitas bibliotecas C ++ que não fazem parte do padrão, e, usando a especificação de ligação, as bibliotecas podem ainda ser escritos em linguagens como BASIC , C , Fortran, ou Pascal. Qual destes são suportados depende do compilador.

A biblioteca padrão C ++ incorpora a biblioteca padrão C com algumas pequenas modificações para torná-lo otimizado com a linguagem C ++. Outra grande parte da biblioteca C ++ baseia-se na STL. Isto proporciona tais como ferramentas úteis recipientes (por exemplo e vectores listas), iterators para fornecer esses recipientes com acesso e matriz-como algoritmos para realizar operações como pesquisa e classificação. Além disso (multi) mapas ( arrays associativos) e (multi) conjuntos são fornecidos, os quais interfaces compatíveis exportação. Por isso, é possível, usando modelos, para escrever algoritmos genéricos que funcionam com qualquer recipiente ou em qualquer seqüência definida por iteradores. Como em C, a características do biblioteca são acessados usando o #include directiva para incluir um cabeçalho padrão. C ++ fornece 105 cabeçalhos padrão, dos quais 27 são reprovados.

A STL foi originalmente uma biblioteca de terceiros a partir de HP e mais tarde SGI, antes da sua incorporação no padrão C ++. O principal arquiteto por trás do STL é Alexander Stepanov, que experimentou com algoritmos genéricos e contentores para muitos anos. Quando ele começou com C ++, ele finalmente encontrou uma linguagem em que foi possível para criar algoritmos genéricos (por exemplo, STL tipo) que executam ainda melhor do que, por exemplo, o QSort biblioteca padrão C, graças a C ++ características como usar inlining e de compilação vinculativo tempo em vez de ponteiros de função. A norma não se referem a ele como "STL", uma vez que é apenas uma parte da biblioteca padrão, mas o termo ainda é amplamente usado para distingui-lo do resto da biblioteca padrão (entrada / fluxos de saída, internacionalização, diagnósticos, o subconjunto biblioteca C, etc).

A maioria dos compiladores C ++ fornecem uma implementação da biblioteca C ++ padrão, incluindo o STL. Implementações independentes de compilador do STL, como STLport, também existem. Outros projetos também produzem várias implementações personalizadas do C ++ biblioteca padrão ea STL com vários objetivos do projeto.

Recursos de linguagem

C ++ herda a maioria de A sintaxe do C. O que se segue é a versão de Bjarne Stroustrup do Olá mundo programa que utiliza o C ++ instalação de fluxo de biblioteca padrão para escrever uma mensagem para saída padrão:

 # Incluem 
 
 int main ()
 {
    std :: cout << "Olá, mundo! \ n";
 }

Dentro de funções que definem um tipo de retorno não-vazio, não devolução de um valor antes de controle atinge o final dos resultados em função indefinidos comportamento (compiladores normalmente fornecem os meios para emitir um diagnóstico, em tal caso). A única excepção a esta regra é a main função, que implicitamente retorna um valor de zero.

Operadores e sobrecarga de operador

Os operadores que não pode ser sobrecarregado
Operador Símbolo
Operador de resolução de escopo ::
Operador condicional ?:
operador ponto .
Operador de seleção de membro . *
Operador "sizeof" tamanho de
Operador "typeid" typeid

C ++ oferece mais de 35 operadores, abrangendo a aritmética básica, manipulação de bits, engano, comparações, operações lógicas e outros. Quase todos os operadores pode ser sobrecarregado para tipos definidos pelo usuário, com algumas exceções notáveis, como o acesso de membros ( . e .* ), bem como o operador condicional. O rico conjunto de operadores Sobrecarregáveis é central para usando C ++ como um linguagem específica de domínio. Os operadores Sobrecarregáveis também são uma parte essencial de muitas C ++ técnicas avançadas de programação, tais como ponteiros inteligentes. Sobrecarregar um operador não altera a precedência de cálculos envolvendo o operador, nem alterar o número de operandos que o operador usa (qualquer operando pode no entanto ser ignorados pelo operador, embora ela será avaliada antes da execução). Sobrecarregado " && "e" || "operadores perdem o seu curto-circuito propriedade avaliação.

Gerenciamento de memória

C ++ suporta quatro tipos de gerenciamento de memória:

  • Alocação de memória estática. A variável estática é atribuído um valor em tempo de compilação e armazenamento alocado em um local fixo, juntamente com o código executável. Estes são declarados com a palavra-chave "estática" (no sentido de armazenamento estático, não no sentido de declarar um variável de classe).
  • Alocação automática de memória. Um variável automática é simplesmente declarada com seu nome de classe e de armazenamento é alocados na pilha quando o valor é atribuído. O construtor é chamado quando a declaração é executado, o destruidor é chamado quando a variável sai do escopo, e após o processo de destruição da memória alocada é automaticamente liberado.
  • Alocação dinâmica de memória. O armazenamento pode ser alocado dinamicamente na heap usando gerenciamento de memória manual - normalmente chamadas para e nova apagar (embora as chamadas de estilo antigo C tais como malloc () e free () ainda são suportados).
  • Com o uso de uma biblioteca, coleta de lixo é possível. O Boehm colector de lixo é vulgarmente utilizado para este fim.

A multa controle sobre o gerenciamento de memória é semelhante ao C, mas em contraste com línguas que pretendem esconder tais detalhes do programador, tais como Java, Perl, PHP e Ruby.

Templates

Templates C ++ ativar programação genérica. C ++ suporta ambos os modelos de função e de classe. Modelos podem ser parametrizados por tipos, constantes de tempo de compilação e outros modelos. Templates C ++ são implementadas por instanciação em tempo de compilação. Para instanciar um modelo, compiladores substituir argumentos específicos para os parâmetros de um modelo para gerar uma função concreta ou instância de classe. Algumas substituições não são possíveis; estes são eliminados por uma política de resolução de sobrecarga descrita pela frase " Substituição falha não é um erro "(SFINAE). Os modelos são uma ferramenta poderosa que pode ser usada para programação genérica, metaprogramming modelo e otimização de código, mas este poder implica um custo. Use os modelos podem aumentar o tamanho do código, porque cada instância de modelo produz uma cópia do código do modelo: um para cada conjunto de argumentos de modelo. Isto está em contraste com a de tempo de execução genéricos observados em outras línguas (por exemplo, Java), onde em tempo de compilação do tipo é apagado e um corpo único modelo é preservada.

Os modelos são diferentes das macros: enquanto ambos os recursos de linguagem de tempo de compilação permitir compilação condicional, modelos não estão restritos a substituição lexical. Modelos estão cientes da semântica e tipo de sistema de sua língua companheiro, bem como todas as definições de tipo em tempo de compilação, e pode executar operações de alto nível, incluindo o controle de fluxo programático com base na avaliação de parâmetros estritamente verificados-Type. Macros são capazes de controle condicional sobre compilação com base em critérios pré-determinados, mas não é possível instanciar novos tipos, recurse, ou realizar avaliação tipo e em vigor são limitadas a pré-compilação texto de substituição e text-inclusão / exclusão. Em outras palavras, as macros podem controlar o fluxo de compilação com base em símbolos pré-definido, mas não pode, ao contrário dos modelos, independentemente instanciar novos símbolos. Os modelos são uma ferramenta para estática polimorfismo (ver abaixo) e programação genérica.

Além disso, os modelos são um mecanismo de tempo de compilação em C ++ que é Turing completo, o que significa que qualquer expressável computação por um programa de computador pode ser calculado, de alguma forma, por um template metaprograma antes da execução.

Em resumo, um modelo é uma função com parâmetros em tempo de compilação ou classe escrito sem conhecimento dos argumentos específicos usados para instanciá-lo. Depois de instanciação, o código resultante é equivalente ao código escrito especificamente para os argumentos passados. Desta forma, os modelos oferecem uma maneira de separar aspectos genéricos, amplamente aplicáveis de funções e classes (codificados em modelos) de aspectos específicos (codificados em parâmetros do modelo) sem sacrificar o desempenho, devido à abstração.

Objectos

C ++ introduz programação orientada a objetos (OOP) apresenta a C. Ele oferece aulas, que fornecem as quatro características comumente presentes em OOP (e alguns não-OOP) idiomas: abstração, encapsulamento, herança, e polimorfismo. Uma característica distintiva de classes C ++ em comparação com aulas em outras linguagens de programação é o suporte para determinista destruidores, que por sua vez fornecem suporte para o Aquisição de recursos é Inicialização conceito (RAII).

Encapsulation

O encapsulamento é o esconderijo da informação para garantir que as estruturas de dados e operadores são usados como pretendido e para tornar o modelo de uso mais óbvio para o desenvolvedor. C ++ fornece a capacidade de definir classes e funções como seus mecanismos de encapsulamento primários. Dentro de uma classe, os membros podem ser declarados como qualquer público, protegido ou privado para impor explicitamente encapsulamento. Um membro público da classe é acessível a qualquer função. Um membro privado é acessível apenas para funções que são membros dessa classe e de funções e classes permissão de acesso explicitamente concedido pela classe ("amigos"). Um membro protegido é acessível a membros de classes que herdam da classe além da própria classe e amigos.

O princípio OO é que todas as funções (e somente as funções) que acessam a representação interna de um tipo deve ser encapsulado dentro do definição de tipo. C ++ suporta este (via funções de membro e funções friend), mas não aplicá-la: o programador pode declarar partes ou a totalidade da representação de um tipo de ser público, e é permitido fazer entidades públicas que não fazem parte da representação de o tipo. Portanto, C ++ suporta não apenas programação OO, mas outros paradigmas de decomposição mais fracos, como programação modular.

É geralmente considerada uma boa prática para fazer tudo dados privados ou protegidos, e para tornar públicas apenas as funções que fazem parte de uma interface mínima para usuários da classe. Isto pode ocultar os detalhes de execução de dados, permitindo que o designer alterar fundamentalmente a aplicação posterior sem alterar a interface de qualquer forma.

Herança

Herança permite que um tipo de dados para adquirir propriedades de outros tipos de dados. A herança a partir de uma classe base pode ser declarado como público, protegido ou privado. Este especificador de acesso determina se as classes independentes e derivados pode acessar os membros públicos e protegidos herdados da classe base. Apenas herança pública corresponde ao que normalmente se entende por "herança". As outras duas formas são muito menos freqüentemente usado. Se o especificador de acesso for omitido, uma "classe" herda privada, enquanto um "struct" herda publicamente. Classes de base pode ser declarado como virtual; esta é chamada herança virtual. Herança virtual garante que apenas uma instância de uma classe base existe no gráfico de herança, evitando alguns dos problemas de ambigüidade de herança múltipla.

Herança múltipla é um C ++ característica não encontrada na maioria dos outros idiomas, permitindo uma classe a ser derivados de mais de um classes de base; isso permite relações de herança mais elaborados. Por exemplo, um "vôo do gato" classe pode herdar de ambos "Gato" e "Mamífero vôo". Algumas outras línguas, como o C # ou Java , realizar algo semelhante (embora mais limitado), permitindo que a herança de múltiplos as interfaces enquanto restringindo o número de classes de base para um (interfaces, ao contrário de aulas, fornecer apenas declarações de funções de membro, não existem dados de execução ou membro). Uma interface como em C # e Java pode ser definido em C ++ como uma classe que contém funções virtuais puros única, muitas vezes conhecido como classe base abstrata ou "ABC". As funções de membro de tal uma classe abstrata de base são normalmente explicitamente definido na classe derivada, não herdado de forma implícita. C ++ herança virtual apresenta uma característica resolução ambiguidade chamado dominância.

Polimorfismo

Polimorfismo permite uma interface comum para muitas implementações, e para objetos de agir de forma diferente em diferentes circunstâncias.

C ++ oferece suporte a vários tipos de estática ( em tempo de compilação) e dinâmica ( run-time) polimorfismos. Em tempo de compilação polimorfismo não permite certas decisões em tempo de execução, enquanto o polimorfismo em tempo de execução geralmente incorre em uma penalidade de desempenho.

Polimorfismo estático

Sobrecarga de função permite que programas para declarar múltiplas funções com o mesmo nome (mas com argumentos diferentes). As funções são distinguidos pelo número ou tipos das suas parâmetros formais. Assim, o mesmo nome de função pode referir-se a diferentes funções, dependendo do contexto em que é usada. O tipo retornado pela função não é utilizado para distinguir funções sobrecarregadas e resultaria em uma mensagem de erro em tempo de compilação.

Quando declarar uma função, um programador pode especificar para um ou mais parâmetros de valor padrão. Isso permite que os parâmetros com defaults, opcionalmente, ser omitidos quando a função é chamada, caso em que os argumentos padrão será usado. Quando uma função é chamada com menos argumentos do que lá são parâmetros declarou, argumentos explícitos são compatíveis com os parâmetros no sentido da esquerda para a direita, com os parâmetros incomparáveis no final da lista de parâmetros que está sendo atribuído seus argumentos padrão. Em muitos casos, especificando argumentos padrão em uma única declaração de função é preferível a prestação de definições de funções sobrecarregadas com diferentes números de parâmetros.

Templates em C ++ fornecem um mecanismo sofisticado para escrever genérico, código polimórfico. Em particular, através da Curiosamente Recurring Template Padrão, é possível implementar uma forma de polimorfismo estático que imita a sintaxe para substituir as funções virtuais. Como os modelos C ++ são do tipo-aware e Turing completo, eles também podem ser usados para permitir que os condicionais recursiva compilador resolver e gerar programas substanciais através metaprogramming modelo. Ao contrário de alguns opinião, código de modelo não irá gerar um código de volume após a compilação com os ajustes apropriados do compilador.

Polimorfismo dinâmico

Herança

Ponteiros variáveis (e referências) para um tipo de classe base em C ++ pode se referir a objetos de quaisquer classes derivadas desse tipo, além de objetos correspondentes exatamente o tipo de variável. Isso permite que matrizes e outros tipos de recipientes para armazenar ponteiros para objetos de tipos diferentes. Porque atribuição de valores a variáveis geralmente ocorre em tempo de execução, este é necessariamente um fenômeno de tempo de execução.

C ++ também fornece um dynamic_cast operador, o que permite que o programa para tentar segurança conversão de um objecto para um objecto de um tipo de objecto mais específico (em oposição a conversão para um tipo mais geral, que é sempre permitido). Esta característica baseia-se informações de tipo de tempo de execução (RTTI). Objectos que se sabe ser de um certo tipo específico também pode ser convertido para este tipo com static_cast , uma construção puramente em tempo de compilação que é mais rápido e não necessita de RTTI.

Funções membro virtuais

Normalmente, quando uma função em uma classe derivada substitui uma função em uma classe base, a função a ser chamada é determinada pelo tipo de objeto. A função dada é substituído quando não existe nenhuma diferença no número ou tipo de parâmetros entre dois ou mais definições de função que desempenha. Assim, em tempo de compilação, que pode não ser possível determinar o tipo do objeto e, portanto, a função correta para chamar, dado apenas um ponteiro de classe base; a decisão é, portanto, adiada até a execução. Isto é chamado expedição dinâmica. Funções membro virtuais ou métodos permitem a implementação mais específica da função a ser chamada, de acordo com o tipo real de tempo de execução do objeto. Em implementações C ++, este é normalmente feito usando tabelas de funções virtuais. Se o tipo de objeto é conhecido, isso pode ser contornado, antecedendo um nome de classe totalmente qualificado antes de a chamada de função, mas em chamadas gerais para funções virtuais são resolvidos em tempo de execução.

Além de funções de membro padrão, sobrecargas e destruidores operador pode ser virtual. A regra geral é que, se todas as funções da classe são virtual, o processo de destruição deve ser bem. Como o tipo de um objeto em sua criação é conhecido em tempo de compilação, construtores, e por extensão construtores de cópia, não pode ser virtual. Não obstante a situação pode surgir onde uma cópia de um objeto precisa ser criado quando um ponteiro para um objeto derivado é passada como um ponteiro para um objeto de base. Em tal caso, uma solução comum é a criação de um clone() (ou similar) função virtual que cria e retorna uma cópia da classe derivada quando chamado.

A função de membro também pode ser feita "puro virtual", anexando-o com = 0 , após o parêntese de fechamento e antes do ponto e vírgula. Uma classe que contém uma função virtual pura é chamado um tipo de dados abstrato. Os objetos não podem ser criados a partir de tipos de dados abstratos; eles só podem ser derivados a partir de. Qualquer classe derivada herda a função virtual pura e deve fornecer uma definição não-puro dela (e todas as outras funções virtuais puras), antes de objetos da classe derivada pode ser criado. Um programa que tenta criar um objeto de uma classe com uma função de membro virtual pura ou função de membro virtual pura herdou é mal-formado.

Compatibilidade

Produzir um compilador razoavelmente compatível com os padrões C ++ tem provado ser uma tarefa difícil para os fornecedores do compilador em geral. Por muitos anos, diferentes compiladores C ++ implementado a linguagem C ++ para diferentes níveis de conformidade à norma, e suas implementações variou amplamente em algumas áreas, tais como especialização de modelo parcial. Os recentes lançamentos de compiladores C ++ mais populares suporta quase todo o padrão C ++ 1998.

Para dar compilador fornecedores de maior liberdade, o comitê de padrões C ++ decidiu não ditar a implementação de desconfiguração do nome, manipulação de exceção, e outras características específicas de implementação. A desvantagem desta decisão é que código objeto produzido por diferentes compiladores é esperado para ser incompatível. Não foram, no entanto, as tentativas para padronizar compiladores para máquinas específicas ou sistemas operacionais (por exemplo C ++ ABI), embora eles parecem estar em grande parte abandonada agora.

Modelos exportados

Um determinado ponto de discórdia é a export de palavras-chave, destinam-se a permitir definições de modelo a ser separadas de suas declarações. O primeiro compilador amplamente disponíveis para a implementação export foi Comeau C / C ++, no início de 2003 (cinco anos após o lançamento da norma); em 2004, o compilador de beta Borland C ++ Builder X também foi lançado com export . Ambos os compiladores são baseadas no EDG C ++ front-end. Outros compiladores como GCC não apoiá-lo em tudo. Começando ANSI C ++ por Ivor Horton fornece exemplo de código com a palavra-chave que não irá compilar na maioria dos compiladores, sem referência a este problema. Herb Sutter, ex-organizador do comitê de padrões de C ++, recomendou que export ser removido de futuras versões do padrão C ++. Durante a padrões ISO C ++ reunião de Março de 2010, o comitê de padrões C ++ votaram para remover os modelos exportados inteiramente a partir de C ++ 11, mas reservar a palavra-chave para uso futuro.

Com C

C ++ é muitas vezes considerado como um super conjunto de C , mas isso não é rigorosamente verdade. Mais código C pode ser facilmente feito para compilar corretamente em C ++, mas existem algumas diferenças que causam algum código C válido para ser inválido ou se comportar de maneira diferente em C ++.

Uma diferença comumente encontrado é que C permite conversão implícita de void* para outros tipos de ponteiro, mas C ++ não faz. Outro problema comum é que a portabilidade C ++ define muitas novas palavras-chave, tais como a new e class , que podem ser utilizados como identificadores (eg nomes de variáveis) em um programa C.

Algumas incompatibilidades foram removidos pela revisão da norma C 1999 ( C99), que agora suporta recursos C ++, como comentários de linha ( // ) e declarações mistos e código. Por outro lado, C99 introduziu uma série de novos recursos que C ++ não suportam, como matrizes de comprimento variável, os tipos nativos dos números complexos, inicializadores designados e literais compostos. No entanto, pelo menos algumas das características C99-introduzidas foram incluídos na versão subsequente do padrão C ++, C ++ 11:

  • C99 pré-processador (incluindo macros variádicos, ampla concatenação literal estreita /, mais amplo aritméticas inteiro)
  • _Pragma ()
  • long long
  • __func__
  • Cabeçalhos:
    • cstdbool ( stdbool.h )
    • cstdint ( stdint.h )
    • cinttypes ( inttypes.h ).

Para misturar C e C ++ do código, qualquer declaração de função ou definição que está a ser chamado de / utilizado tanto em C e C ++ deve ser declarada com ligação C, colocando-o dentro de um extern "C" {/*...*/} bloco . Tal função pode não contar com recursos dependendo nome desconfiguração (ou seja, a sobrecarga de função).

Crítica

Devido ao seu grande conjunto de recursos e sintaxe "strict" oft-percepção, a linguagem é por vezes criticada por ser demasiado complicado e, portanto, difícil de dominar completamente.

C ++ é, por vezes comparado desfavoravelmente com mais estritamente orientada a objeto idiomas na base que permite aos programadores "misturar e combinar" declarativa, funcional, genérico, modular, e estilos de programação processuais com programação orientada a objetos, em vez de fazer respeitar rigorosamente um único estilo, embora C ++ é intencionalmente um linguagem multi-paradigma. Também carece de alguns recursos, como reflexão, embora adicionando este último tem sido contemplada.

Um artigo satírico amplamente distribuído retratado Bjarne Stroustrup, entrevistado para uma edição da revista IEEE Computer 1998, confessando que C ++ foi deliberadamente concebido para ser complexa e difícil, capina programadores amadores e elevar os salários dos poucos programadores que poderia dominar o idioma. A seção FAQ do site pessoal de Stroustrup contém uma negação e um link para a entrevista real.

Richard Stallman critica C ++ para ter gramática ambígua e ", incompatibilidades triviais gratuitos com C [...] que não são de grande benefício." Linus Torvalds disse em um e-mail famosa que C ++ foi uma "linguagem horrível '.

Finalmente, vários autores observaram que C ++ não é uma verdadeira linguagem orientada a objetos.

O mesmo problema ocorre com as linguagens de programação. Como afirmado anteriormente, muitos programadores C moveu para o reino da orientação a objetos por migrar para C ++ antes de serem diretamente expostos a conceitos OO. Isso sempre saem em uma entrevista. Muitas vezes os desenvolvedores que se dizem programadores C ++ são simplesmente programadores C usando C ++ compiladores. [...] Nós já mencionamos que o C ++ não é uma verdadeira linguagem de programação orientada a objetos, mas na verdade é uma linguagem de programação baseada em objetos. Lembre-se que C ++ é considerado baseado em objeto. Conceitos de orientação a objetos não são aplicadas. Você pode escrever um programa não-orientado a objeto C usando um compilador C ++.
-Matt Weisfeld,
É interessante ver o que está sendo feito no mundo sob o nome orientada a objetos. Foi-me mostrado algumas peças olhando muito, muito estranhas de código ao longo dos anos, por várias pessoas, incluindo pessoas em universidades, que eles disseram é OOP código escrito em uma linguagem OOP-e, na verdade, eu inventei o termo orientada a objetos, e eu posso te dizer, eu não tenho C ++ em mente.
- Alan Kay, Smalltalk co-criador,
Retirado de " http://en.wikipedia.org/w/index.php?title=C%2B%2B&oldid=555926964 "