Você está na página 1de 18

C++

Origem: Wikipdia, a enciclopdia livre.

C++

Programa Ol Mundo, escrito em C++. Paradigma Abstrao de dados, Orientao a objeto, Programao genrica, Programao procedural 1985 ISO/IEC 14882:2011 (setembro de
2011)

Surgido em ltima verso Criado por

Bjarne Stroustrup

Estilo de tipagem: Esttica, fraca ou forte, insegura Compiladores C++ Builder, G++, MinGW, Microsoft Visual C++, Xcode Dialetos: ISO/IEC 14882:1998 ISO/IEC 14882:2003 ISO/IEC 14882:2011

Influenciada por Ada 83, ALGOL 68, C, CLU, ML, Simula Influenciou Ada 95, C, D, Java, PHP, Squirrel

O C++ (em portugus l-se "c mais mais") uma linguagem de programao multiparadigma e de uso geral. A linguagem considerada de mdio nvel, pois combina caractersticas de linguagens de alto e baixo nveis. Desde os anos 1990 uma das linguagens comerciais mais populares, sendo bastante usada tambm na academia por seu grande desempenho e base de utilizadores. Bjarne Stroustrup desenvolveu o C++ (originalmente com o nome C with Classes,[1] que significa C com classes em portugus) em 1983 no Bell Labs como um adicional linguagem C. Novas caractersticas foram adicionadas com o tempo, como funes virtuais, sobrecarga de operadores, herana mltipla, gabaritos e tratamento de excees. Aps a padronizao ISO realizada em 1998 e a posterior reviso realizada em 2003, uma nova verso da especificao da linguagem foi lanada em setembro de 2011, conhecida informalmente como C++11 ou C++0x.[2][3][4]

[editar] Histria
[editar] A evoluo da linguagem
O C++ foi inicialmente desenvolvido por Bjarne Stroustrup dos Bell Labs, durante a dcada de 1980 com o objetivo implementar uma verso distribuda do ncleo Unix.[1] Como o Unix era escrito em C, dever-se-ia manter a compatibilidade, ainda que adicionando novos recursos. Alguns dos desafios incluam simular a infraestrutura da comunicao entre processos num sistema distribudo ou de memria compartilhada e escrever drivers para tal sistema. Stroustrup percebeu que a linguagem Simula 67 possua caractersticas bastante teis para o desenvolvimento de software, mas que era muito lenta para uso prtico. Por outro lado, a linguagem BCPL era rpida, mas possua demasiado baixo nvel, dificultando sua utilizao no desenvolvimento de aplicaes. A partir de sua experincia de doutorado, comeou a acrescentar elementos do Simula 67 no C, especialmente os recursos de criao e manipulao de objetos. O C foi escolhido como base de desenvolvimento da nova linguagem pois possua uma proposta de uso genrico, era rpido e tambm portvel para diversas plataformas. Algumas outras linguagens que tambm serviram de inspirao para o cientista da computao foram ALGOL 68, Ada, CLU e ML.

Bjarne Stroustrup, idealizador da linguagem C++ Ainda em 1983 o nome da linguagem foi alterado de C with Classes para C++. Antes implementada usando um pr-processador, a linguagem passou a exigir um compilador prprio, escrito pelo prprio Stroustrup. [1] Novas caractersticas foram adicionadas, como funes virtuais,[1] sobrecarga de operadores e funes,[1] referncias, constantes, gerenciamento manual de memria, melhorias na verificao de tipo de dado e estilo de comentrio de cdigo de uma linha (//). Em 1985 foi lanada a primeira edio do livro The C++ Programming Language, contendo referncias para a utilizao da linguagem, j que ainda no era uma norma oficial. A primeira verso comercial foi lanada em outubro do mesmo ano.[5] Em 1989 a segunda verso foi lanada, contendo novas caractersticas como herana mltipla, classes abstratas, mtodos estticos, mtodos constantes e membros protegidos, incrementando o suporte a orientao a objeto. Em 1990 foi lanado o livro The Annotated C++ Reference Manual, que tornou-se base para o futuro padro. Outras adies na linguagem incluem gabaritos, tratamento de excees, espao de nomes, converso segura de tipo de dado e o tipo booleano.

Assim como a linguagem, sua biblioteca padro tambm sofreu melhorias ao longo do tempo. Sua primeira adio foi a biblioteca de E/S, e posteriormente a Standard Template Library (STL); ambas tornaram-se algumas das principais funcionalidades que distanciaram a linguagem em relao a C. Criada primordialmente na HP por Alexander Stepanov[6] no incio da dcada de 1990 para explorar os potenciais da programao genrica, a STL foi apresentada a um comit unificado ANSI e ISO em 1993 convite de Andrew Koenig. Aps uma proposta formal na reunio do ano seguinte, a biblioteca recebe o aval do comit. Depois de anos de trabalho, o mesmo comit ANSI/ISO padronizou o C++ em 1998 (ISO/IEC 14882:1998). Aps alguns anos foram reportados defeitos e imprecises no documento, e uma correo foi lanada em 2003.[7] Por muito tempo, o C++ foi encarado como um superconjunto do C. [nota 1] Entretanto, em 1999 o novo padro ISO para a linguagem C tornou as duas linguagens ainda mais diferentes entre si. Devido a essas incompatibilidades, muitas empresas que desenvolvem compiladores no oferecem suporte verso mais recente da linguagem C. Pode-se dizer que C++ foi a nica linguagem entre tantas outras que obteve sucesso como uma sucessora linguagem C, inclusive servindo de inspirao para outras linguagens como Java, a IDL de CORBA e C.

[editar] Etimologia
Durante sua fase inicial de desenvolvimento, a linguagem era chamada "novo C", "C84" ou ainda "C com classes".[1] O termo "C++" creditado a Rick Mascitti, [8] e foi utilizado pela primeira vez em dezembro de 1983. Ele uma referncia ao operador de incremento ++, significando um acrscimo (uma evoluo) linguagem C. Em tom humorado, desenvolvedores software e especialistas em informtica no incio da dcada de 1990 costumavam relacionar o ++ do nome grande insistncia dos programadores em utilizar o C++ da mesma forma que a linguagem C, no usufruindo das novas facilidades que a linguagem poderia fornecer. Assim como o ++ estava sendo aplicado de maneira ps-fixa letra C, a linguagem C++ era uma evoluo do C ps-fixada, que s tornar-se-ia realidade em algum futuro remoto, no naquele momento.

[editar] Trabalhos futuros


A linguagem continua evoluindo de forma a fornecer novas funcionalidades. O grupo de desenvolvimento Boost.org trabalha para evoluir a biblioteca padro, informando o comit oficial da linguagem quais facilidades possuem maior retorno positivo dos usurios, seja por qualidade ou por utilidade, e quais ainda devem ser desenvolvidas. Tudo indica que o C++ continuar com sua natureza multiparadigma. Por exemplo, o trabalho da Boost.org dedica-se a acrescentar as qualidades da programao funcional e genrica. O padro C++ no define a implementao para a definio de nomes e tratamento de excees, entre outras facilidades especficas, o que frequentemente torna incompatveis cdigos objeto produzidos por diferentes compiladores. Apesar disso, existem padres perifricos especficos para certas plataformas ou sistemas operacionais para padronizar compiladores dessas plataformas, como por exemplo o C++ ABI.[nota 2] As empresas de desenvolvimento de compiladores ainda se esforam para suportar inteiramente o padro, especialmente na rea de gabaritos. Uma das disputas se refere

palavra reservada export, que permite que a definio de um gabarito seja separada de sua declarao. O primeiro compilador a implementar export foi o Comeau C++ em 2003 (cinco anos aps o lanamento do padro), e no ano seguinte uma verso beta do Borland C++ Builder X tambm suportava a facilidade. Interessante notar que ambos os compiladores so baseados na verso EDG do C++. Muitos livros fornecem exemplos de cdigos para implementar export[nota 3] que no so compilveis, mas no h referncias para o problema mencionado. Outros compiladores como o Microsoft Visual C++ e o GCC no suportam a facilidade. O secretrio do comit oficial do C++ Herb Sutter recomendou que a palavra fosse removida de verses futuras do padro da linguagem, [9] mas aps discusso a deciso final foi mant-la.[10] Outras disputas relativas a gabaritos se referem especializao parcial, que foi pouco suportada por muitos anos depois que o C++ padro foi lanado. Atualmente a linguagem tem uma nova especificao, conhecida por C++11 e publicada como 14882:2011.[11]

[editar] Caractersticas
[editar] Filosofia
No livro In The Design and Evolution of C++ (1994), Bjarne Stroustrup descreve algumas regras que ele utiliza para desenvolver a linguagem, como exemplificado abaixo:

C++ desenvolvido para ser uma linguagem tipada estaticamente e de propsito geral que to eficiente e porttil quanto o C. C++ desenvolvido para suportar mltiplos paradigmas. C++ desenvolvido para fornecer ao programador escolhas, mesmo que seja possvel ao programador escolher a opo errada. C++ desenvolvido para ser o mais compatvel com C possvel, fornecendo transies simples para cdigo C. C++ evita fornecer facilidades que so especficas a certas plataformas ou a certos grupos de desenvolvedores. C++ no exige overhead para facilidades que no so utilizadas. C++ desenvolvido para ser utilizado mesmo sem um ambiente de desenvolvimento sofisticado.

Stanley B. Lippman documenta em seu livro Inside the C++ Object Model (1996)[12] como compiladores convertem cdigo de programas C++ em mapeamentos de memria. Lippman trabalhou implementando e mantendo o C-front, a implementao original do C++ nos Bell Labs. Stroustrup sempre desejou que o C++ fosse mantido como uma linguagem de especificao pequena, apesar de presses externas para adies de novas funcionalidades na especificao da prpria linguagem ao invs da codificao de novas bibliotecas para a biblioteca padro. Brian Kernighan notou que enquanto em C existe geralmente uma maneira de resolver problemas, em C++ existem vrias. Na maioria das linguagens de programao, um padro ou um conjunto bastante restrito de padres de projeto de software escolhido para o desenvolvimento. Entretanto, isso no acontece em C++, pois a escolha delegada ao

desenvolvedor. um conceito que prega que no existe paradigma de programao ou padro de desenvolvimento que resolva todos os problemas, por isso a pluralidade e generalidade de aplicaes para a linguagem. Tal filosofia assusta iniciantes e professores, que sentem que a linguagem deveria ser de fcil aprendizado, algo que o C++ no .

[editar] Biblioteca padro


Ver artigo principal: Biblioteca padro do C++ Ver artigo principal: Standard Template Library A biblioteca padro do C++ incorpora a biblioteca padro do C com algumas pequenas modificaes para trabalhar melhor com as novas funcionalidades criadas pela linguagem. Outra grande parte da biblioteca composta pela biblioteca padro de gabaritos (STL). Ela fornece ferramentas teis como containers (vetores, listas, entre outros), algoritmos (filtragem de elementos de container, busca, ordenao, entre outros) e iteradores (ponteiros inteligentes genricos para acessar tais containers e interlig-los aos algoritmos). Usando gabaritos possvel escrever algoritmos genricos que funcionam para qualquer container ou sequncia definida por iteradores. Tendo em vista que um iterador nada mais que um ponteiro encapsulado, possvel tambm utilizar os algoritmos genricos em vetores C, utilizando-se ponteiros comuns para tal. Como em C, os mdulos da biblioteca so acessadas utilizando a diretiva #include; ao todo so fornecidos 69 cabealhos-padro, dos quais 19 esto em depreciao. Devido ao fato da biblioteca padro ter sido desenvolvida por especialistas e de j ter sido amplamente utilizada comercialmente e academicamente, recomendado utilizar seus componentes ao invs de componentes prprios. Por exemplo, utilizar std::vector e std::string ao invs de declarar vetores herdados do C no somente torna o desenvolvimento mais simples, como tambm traz mais segurana e escalabilidade para o sistema. A biblioteca STL foi originalmente desenvolvida pela HP[6] e posteriormente pela SGI, antes de sua incorporao na biblioteca padro do C++. O padro no a define como "STL", mas ainda utiliza-se esse termo para distingui-la do resto da biblioteca. O projeto STLPort mantm uma implementao atualizada da biblioteca, e baseado na SGI STL. O projeto Boost fornece elementos adicionais STL, dos quais alguns j so considerados a serem parte da biblioteca padro no futuro.

[editar] Operadores
Ver artigo principal: Operadores em C e C++ Os operadores em C++ so um conjunto de todos os operadores do C mais novas adies linguagem. Um grupo de novos operadores do C++ so os relativos converso de tipo de dado, e consistem em const_cast, static_cast, dynamic_cast e reinterpret_cast. Eles so uma evoluo a converso de dados utilizada em C, que limitava-se a oferecer um mtodo para converso tal qual static_cast. dynamic_cast refere-se diretamente ao suporte de herana e polimorfismo oferecido pela linguagem, e est relacionado a outro novo operador, typeid, que retorna informaes sobre o tipo de dado derivado pelo operando. Ambos os operadores requerem a habilitao de RTTI para funcionar. Outro grupo de novos

operadores so os relativos alocao de memria, e consistem em new e delete. Assemelham-se s funes malloc e free respectivamente, que esto presentes na biblioteca padro do C. Outro novo operador o de resoluo de mbito, ::, e que refere-se diretamente ao suporte de espao de nomes e orientao a objeto oferecido pela linguagem. Com ele possvel declarar e acessar espaos de nomes, e tambm declarar classes e acessar objetos. O C++ define que alguns dos operadores podem ser sobrecarregados, o que permite, assim como na sobrecarga de funes, que diferentes tipos de dados sejam passados para um operador de forma a produzir diferentes resultados. Essa tcnica tambm permite que classes definidas por utilizadores tambm possam usufruir de operadores prprios, tornando possvel que uma classe Lista possa sobrecarregar o operador de apndice += para que diversos elementos possam ser adicionados a lista, como elementos ou outras listas. Alguns operadores de classes definidas pelo utilizador devem ser obrigatoriamente sobrecarregados (definidos) a fim de poderem ser utilizados pela STL. Por exemplo, uma classe Funcionario deve fornecer o operador menor que (<) para ser utilizada pela funo de ordenao (sort). De acordo com o padro atual da linguagem, este requerimento implcito durante a compilao: caso a funo sort seja invocada para a um container da classe Funcionario e esta no define o operador <, h erro de compilao. Para padres futuros planeja-se introduzir os "conceitos", que auxiliaram a programao genrica na especificao dos requerimentos de um tipo de dado para que ele seja usado em uma funo. Por exemplo, os iteradores passados para sort estaro associados ao conceito "tipo de dado comparvel", isto , um tipo de dado que declara o operador <. Ao explicitar essa relao o cdigo se torna mais consistente, e o compilador auxiliado a fim de retornar uma mensagem de erro mais adequada ao utilizador caso haja problemas durante a compilao.

[editar] Pr-processador
Ver artigo principal: Pr-processador O C++ compilado em trs fases: pr-processamento, compilao propriamente dita (traduo para cdigo objeto) e ligao.[13][14] Durante a primeira fase, as diretivas de prprocessamento so aplicadas atravs de transformaes lxicas no prprio cdigo fonte, que ento alimenta as prximas fases de compilao. Elas so identificadas no cdigo atravs do caractere #. O pr-processamento utilizado para substituir partes de cdigo, para inutilizar partes de cdigo e para importar mdulos externos. Por exemplo, o cdigo #define PI 3.1415926535897932384626433 far com que sempre que PI aparecer no cdigo, este ser substitudo por 3.1415926535897932384626433 e isso ocorre antes de comear a compilar, como se o usurio tivesse digitado o valor de PI ao invs do texto PI. Outro uso do pr-processador o que segue: #include <iostream> far com que seja includo (importado) todo o contedo da cabealho iostream da biblioteca libc.

[editar] Gabaritos
Os gabaritos so diferentes de macros de programao (que tambm podem ser usadas em C++, um artifcio herdado do C): enquanto ambas as facilidades podem ser utilizadas para produzir cdigo em tempo de compilao, gabaritos no restringem-se substituies lxicas. Eles possuem conhecimento da semntica e do sistema de tipagem da linguagem, e so

utilizados principalmente para polimorfismo esttico (ver exemplo em anexo) e programao genrica. Um gabarito tambm uma mquina de Turing completa. No campo de programao genrica, um tipo de dado parametrizado em C++ chamado uma classe gabarito. Ela define atravs de parmetros como devem ser os tipos de dado internos utilizados ao instanciar o objeto. Dessa maneira possvel codificar uma classe genrica arranjo, que ao ser instanciada pode tornar-se um arranjo de nmeros inteiros ou um arranjo de carros de corrida (desde que carro de corrida esteja definido no mbito da instancializao).

[editar] Objetos
Ver artigo principal: Orientao a objetos O C++ introduziu alguns conceitos de orientao a objetos ao C, como exemplificado pelas classes, que apresentam quatro caractersticas comumente presentes em linguagens de programao orientadas a objeto: abstrao, encapsulamento, herana e polimorfismo. Cada vez que uma classe instanciada criado um objeto na memria, que basicamente um conjunto de atributos e operaes reunidos. [editar] Encapsulamento Ver artigo principal: Encapsulamento O encapsulamento permite que os atributos de classes possam ser declarados como pblicos, privados ou protegidos. Um atributo pblico (o menos restrito) pode ser acessado a partir de qualquer mtodo que tenha acesso ao objeto. Um atributo privado (o mais restrito) s pode ser acessado por mtodos da prpria classe e por mtodos explicitamente declarados como permitidos para tal (utilizando a palavra reservada friend). Atributos protegidos s podem ser acessados por mtodos da mesma classe, por mtodos de classes herdadas e por mtodos explicitamente declarados (utilizando a palavra reservada friend). considerado como uma boa prtica de programao restringir ao mximo o acesso aos atributos, de forma a isolar detalhes de implementao de uma classe, tornando pblicas somente as funes membro que realizam uma interface mnima da classe com outros componentes. O isolamento dos dados proposto pelo encapsulamento no infalvel, podendo ser contornado ao realizar operaes de baixo nvel em objetos. Dessa maneira, um atributo privado pode ser acessado e modificado a partir de um ponteiro para seu endereo de memria sem problemas, ainda que isso seja considerado uma m prtica de programao. Tal caracterstica, herdada da linguagem C, reflexo direto da liberdade que o C++ fornece ao desenvolvedor em relao a padres de projeto de software, cabendo a ele decidir qual o mais adequado para seu algoritmo. O desenvolvedor tanto pode esquecer tal caracterstica, atendo-se somente a detalhes de especificao em alto nvel, quanto adequar tais caractersticas em sua especificao de forma mais baixo nvel, visando desempenho ou algum outro objetivo. [editar] Herana Ver artigo principal: Herana

A herana de uma classe para com outra pode ser declarada como pblica, protegida ou privada. Isso determina o quo relacionadas as classes sero entre si. Somente a herana pblica corresponde ao conceito usual de herana, pois permite acesso total aos atributos da classe-base. Entretanto, pode-se tambm declarar heranas protegidas e privadas, com caractersticas parecidas como as detalhadas anteriormente sobre encapsulamento. Essa funcionalidade adicionou ao C++ a possibilidade de criao de classes abstratas, que no podem ser instanciadas, mas que oferecem interfaces de funcionamento para suas respectivas classes herdadas. Ela um princpio bsico da orientao a objeto para a reutilizao de cdigo, pois permite que classes (possivelmente escritas por outros desenvolvedores e ento no modificveis) possam ser herdadas de forma a ser incrementadas em funcionalidade. A herana mltipla uma das caractersticas do C++ mais controversas. Ela permite que uma classe possa ser derivada de mais de uma classe base, o que pode resultar em um complicado grafo de herana e relacionamento entre classes. Por exemplo, uma classe Gato voador pode ser derivada tanto das classes Gato quanto Mamfero voador. A mistura de heranas reflete em uma mistura de espaos de nomes na classe herdada, o que pode ser resolvido atravs da declarao local de espao de nomes, como explicado adiante.

[editar] Polimorfismo
Ver artigo principal: Polimorfismo Polimorfismo a capacidade de usar um operador ou uma funo de diferentes maneiras, permitir fornecer diferentes significados de acordo com o contexto. Uma vez que um aplicativo escrito utilizando o conceito de polimorfismo, pode ser facilmente estendido, oferecendo novos objetos que estejam em conformidade com a interface original. No necessrio recompilar programas originais, adicionando novos tipos. Apenas a re-vinculao necessria para expor as novas mudanas juntamente com a antiga aplicao. Ele auxilia na reutilizao de cdigo e contribui para a criao de aplicaes robustas. C++ suporta diversos tipos de polimorfismos, sejam estticos (resolvidos em tempo de compilao de cdigo) ou dinmicos (resolvidos em tempo de execuo de cdigo). [editar] Esttico A sobrecarga de funes um polimorfismo esttico que permite que um programa possa declarar vrias funes com o mesmo nome, diferenciando entre si pela quantidade de parmetros apresentados e por seus respectivos tipos de dado. Assim, o mesmo nome de funo pode referir-se a diferentes funes dependendo do contexto em que ela usada. O tipo retornado pela funo no utilizado para distinguir funes sobrecarregadas. A sobrecarga de operadores tambm um polimorfismo esttico que permite que a definio de certos operadores resultem em uma chamada de funo que depende dos tipos de dado dos operadores sendo utilizados. O C++ tambm suporta argumentos padro para os parametros das funes, o que permite omitir tal parmetro na invocao da funo. Quando uma funo chamada com menos argumentos que o esperado e os argumentos explcitos so compatveis com os parmetros da esquerda direita, os ltimos parmetros so atribudos de acordo com o argumento padro. Semanticamente parecida com a sobrecarga de funes, essa tcnica permite simplificar situaes em que uma funo declarada somente para invocar uma sobrecarga dela prpria com algum parmetro especificado.

O C++ implementa polimorfismo paramtrico atravs de gabaritos, que fazem o compilador gere uma instncia separada da classe ou funo usada como gabarito para cada permutao de parmetros de tipo usado com ele, o que pode levar a dificultar a depurao de cdigo. Um benefcio que os gabaritos C++ tm sobre Java e C permitir a metaprogramao por gabaritos, uma forma de pr-avaliao de parte do cdigo em tempo de compilao ao invs de tempo de execuo. Os gabaritos em C++ fornecem um mecanismo sofisticado para a criao de cdigo genrico polimrfico. Em particular, por meio da tcnica Curiously Recurring Template Pattern possvel implementar uma forma de polimorfismo esttico que imita a sintaxe para substituir as funes virtuais. Uma vez que gabaritos so sensveis aos tipos de dados e tambm so Turing completos, tambm podem ser usados para permitir que o compilador resolva condicionais recursivas e gerar programas substanciais atravs de metaprogramao por gabaritos. Entre os usos de polimorfismo esttico, inclui-se funes com o mesmo nome mas que tratam de diferentes parmetros, como soma(int, int) e soma(double, double) (o que, entretanto, ignora as facilidades dos gabaritos.) Tambm, verses novas da mesma funo que recebem parmetros adicionais, como ExportarDados(void* buffer, int tamanho) e ExportarDados(void* buffer, int tamanho, unsigned long opcoes). Mais um uso um mesmo nome de mtodo para atribuir ou obter o valor de uma propriedade, como Classe::Propriedade(int x) e int x Class::Property() const. [editar] Dinmico O polimorfismo por herana um exemplo de polimorfismo dinmico no qual ponteiros de uma classe base podem referenciar objetos de classes derivadas, o que permite que uma chamada de funo virtual seja resolvida em tempo de execuo de cdigo. Ponteiros e referncias de uma classe base podem referenciar objetos de qualquer classe derivada de si, o que permite que arranjos e outros containers de um dado tipo possam armazenar ponteiros de diversos tipos de dados, o que no poderia ser feito de outra maneira em C++. Como no possvel descobrir se a converso do tipo base para o tipo derivado segura em tempo de compilao, a verificao deve ser feita durante a execuo do cdigo. Para isso fornecido o operador dynamic_cast, que permite tentar a converso segura de uma classe mais abstrata (classe base) para outra mais especfica (classe derivada). Para sua utilizao a linguagem dispe do RTTI, uma tcnica para manter em memria informaes sobre o tipo de dado de objetos. Caso a converso no seja possvel uma exceo especfica lanada. Normalmente, quando uma funo em uma classe derivada substitui uma funo em uma classe base, a funo chamada determinada pelo tipo do objeto. Uma dada funo sobrescrita quando no existe nenhuma diferena no nmero ou tipo de parmetros, entre duas ou mais definies para aquela funo. Assim, em tempo de compilao pode no ser possvel determinar o tipo do objeto e, portanto, a funo a ser chamada, tendo apenas um ponteiro de classe base, a deciso adiada at o tempo de execuo. Isso chamado de despache dinmico. Funes ou mtodos virtuais permitem a implementao mais especfica da funo a ser chamada, de acordo com o tipo do objeto em tempo real. Em C++, isto geralmente feito usando tabelas de funes virtuais. Se o tipo de objeto conhecido, isso pode ser contornado, antecipando o nome da classe antes da chamada de funo, mas, em geral chamadas de funes virtuais so resolvidas em tempo de execuo.

Alm das funes de membro padro, sobrecargas do operador e destrutores podem ser virtuais. A regra geral que, se todas as funes da classe so virtuais, o destrutor tambm deve ser assim. Como o tipo de criao de um objeto conhecido em tempo de compilao, construtores de cpia e de extenso, no pode ser virtuais. No entanto pode acontecer de uma cpia de um objeto ser criado quando um ponteiro para um objeto derivado passado como um ponteiro para um objeto base. Nesse caso, uma soluo comum criar um clone() (ou similar) e declarar que a funo como virtual. O mtodo clone() cria e retorna uma cpia da classe quando chamado. Um membro da funo tambm pode ser declarado puramente virtual, acrescentando = 0 aps o parntese de fechamento e antes do ponto e vrgula. Os objetos no podem ser criados de uma classe com uma funo virtual pura e so chamados de tipos de dados abstratos. Esses tipos de dados abstratos s podem ser derivados. Qualquer classe derivada herda a funo virtual pura deve apresentar uma definio no-pura (e todas as outras funes virtuais puras), antes de objetos da classe derivada poderem ser criados. [editar] Regra dos trs Uma regra informal no desenvolvimento orientado a objeto em C++ clama que se uma classe ou estrutura possui um dos seguintes itens, ela provavelmente deveria ter todos os trs:[15] destrutor, construtor de cpia e operador de atribuio ( =). Esse trs mtodos so funes membros especiais criadas pelo compilador automaticamente se no so definidas pelo desenvolvedor. [nota 4] Se um desses mtodos definido explicitamente pelo desenvolvedor, isso significa que a verso gerada pelo compilador no serve para um dos casos, e portanto muito provavelmente tambm no serve para os outros casos. Um adendo a essa regra diz respeito tcnica RAII:[16] se ela for usada ento o destrutor pode ser deixado sem definio (tambm conhecida como "regra dos dois" [17]).

[editar] Tratamento de excees


Ver artigo principal: Tratamento de excees O tratamento de exceo um mecanismo desenvolvido para lidar com a ocorrncia de algumas condies (chamadas excees) que alteram o funcionamento normal do fluxo de um programa de computador. O C++ suporta tal tratamento, de forma que o estado atual de um programa aps uma exceo alterado automaticamente para outro estado pr-definido para a recuperao do sistema. Para isso foram adicionadas linguagem as palavras reservadas try e catch. A primeira especifica um bloco de cdigo que ser vigiado em relao excees, de forma que se uma for identificada, o fluxo de programa ser desviado para um bloco especificado pela segunda palavra reservada. Para um dado bloco try podem existir diversos blocos catch, capturando excees de diferentes tipos de dado. Alternativamente, a sintaxe catch() foi introduzida para especificar um bloco de tratamento de exceo independente do tipo da exceo, genrico.

O conceito puro da cincia da computao para tratamento de excees ainda inclui o bloco de instrues finally, que indica um bloco de cdigo executado aps um bloco try caso nenhuma exceo tenha sido lanada, indicando sucesso na operao. Tal abordagem no foi adicionada ao C++, sendo substituvel por outras tcnicas como RAII[16][18]. De qualquer forma, possvel que essa funcionalidade seja adicionada na prxima especificao da linguagem.

[editar] Espao de nomes


Ver artigo principal: Espao de nomes O C++ introduziu os espaos de nomes para a organizao das bibliotecas, e sua funo agrupar um contexto para identificadores (variveis, funes, classes, estruturas, entre outros). No contexto de sistemas operativos, o espao de nomes poderia ser representado por diretrios. Toda a biblioteca padro est contida no espao de nomes std (abreviao de standard, que em ingls significa padro). Para utilizar um espao de nomes pode ser feita tanto uma declarao global dos espaos quanto local. Uma declarao global normalmente inserida no incio dos mdulos, aps a importao dos mdulos externos, utilizando a palavra reservada using (como em using namespace std;, ver exemplo contextualizado em anexo). Ela tambm pode ser usada em um mbito pr-determinado por um bloco de cdigo. Uma declarao local inserida antes de invocar o identificador envolvido, utilizando o operador de resoluo de mbito :: (como em std::cout, ver exemplo contextualizado em anexo). A declarao global til para reduzir a quantidade de cdigo produzido, sub entendendo a origem dos identificadores utilizados em todo um mbito. Apesar disso, ela deixa margem ambiguidades, pois possvel que um mesmo identificador esteja presente em mais de um espao de nome importado no mdulo. Para eliminar esse problema deve-se, alm de utilizar a declarao global, declarar o identificador ambguo localmente cada vez que ele for utilizado. Em determinadas ocasies, espaos de nome no considerados durante a primeira verificao do espao de nomes de uma funo podem tambm ser utilizados na busca, dependendo dos tipos de dados utilizados nos argumentos. A tcnica, chamada busca de nomes dependente de argumento ou Koening lookup, ocorre quando a busca explcita pela funo no encontra correspondente, comeando ento a procurar por espaos de nomes associados. Um padro muito utilizado pela Standard Template Library declarar sobrecarga de operadores que somente so encontrados pelo compilador atravs dessa tcnica.

[editar] Ponteiros e referncias


Ver artigo principal: Ponteiro (programao) Ver artigo principal: Referncia (cincia da computao) O C++ herdou a funcionalidade de ponteiros do C e toda a aritmtica de ponteiros disponvel para aquela linguagem: tratando um ponteiro como um tipo inteiro possvel mover-se facilmente por regies de memria. A instncia de um ponteiro em C++ uma varivel que armazena um endereo de memria, e que pode ser nula. A biblioteca padro ainda fornece auto_ptr, uma espcie de ponteiro inteligente para contagem de referncias que pode ser utilizado em algumas situaes como uma alternativa segura aos ponteiros primitivos do C, automatizando o processo de desalocao de memria do objeto apontado pelo ponteiro.

Por questes de segurana, o C++ introduziu tambm o tipo de dado referncia, um tipo mais restrito de ponteiro. Uma referncia definida para outro objeto no pode ser mais referenciada, qualquer ocorrncia do nome no cdigo diz respeito ao objeto referenciado. Como consequncia, no possvel realizar "aritmtica de referncias". Outra consequncia que no possvel alterar uma referncia para que ela defina outro objeto; aps definida, essa relao vale para todo o tempo de vida. Em contrapartida, um mesmo ponteiro frequentemente aponta para diferentes reas de memria. Apesar de teoricamente possvel[nota 5], a existncia de referncias nulas no considerada, podendo-se assumir que uma referncia sempre indica um objeto vlido em memria.

[editar] Incompatibilidade com C


incorreto considerar o C++ como um super conjunto de C, isto , uma linguagem que implementa o C completamente e que adiciona novas funcionalidades. [19] Grande parte de cdigo C pode ser perfeitamente compilado em C++, mas existem algumas pequenas diferenas sintticas e semnticas entre as linguagens que tornam alguns trechos de cdigo C vlidos em cdigo C++ invlido, ou cdigos que exibem comportamentos diferentes em cada linguagem.[20] Talvez a diferena mais comum que C permite a converso implcita entre o tipo de dado void* para ponteiros para outros tipos, algo que o C++ no permite. Logo, o seguinte cdigo em C vlido:
int *i = malloc(sizeof(int) * 5); para int* */ /* converso implcita de void*

Para assegurar-se que o cdigo funcione tanto em C quanto C++ necessrio explicitar a converso:
int *i = (int *) malloc(sizeof(int) * 5); /* converso explcita de void* para int* */

Outra questo de portabilidade entre as linguagens o fato do C++ adicionar vrias novas palavras reservadas, como new e class, que podem ser utilizadas como identificadores (por exemplo nomes de variveis) em C, gerando incompatibilidade. Algumas outras incompatibilidades foram removidas no padro C99, que agora suporta facilidades como comentrios por //.[20] Tanto C99 quanto C++ definem o tipo de dado bool e suas respectivas constantes true e false. Apesar disso, enquanto a definio no C++ embarcada na prpria linguagem, tornando tais elementos palavras reservadas, em C tais identificadores so declarados atravs da biblioteca padro stdbool.h. Algumas construes sintticas so vlidas tanto em C quanto C++, mas produzem resultado diferente. Por exemplo, o valor literal 'a' possui tipo de dado int em C e char em C++, o que significa que uma chamada sizeof('a'), que retorna a quantidade de bytes ocupada pelo identificador, pode resultar em resultados diferentes entre as duas linguagens. Na prtica, esse exemplo especfico no realmente um problema j que caracteres literais so convertidos para o tipo int implicitamente pelo compilador tanto em C quanto em C++.

[editar] Anlise sinttica do cdigo fonte


Como a gramtica C++ bastante complexa, difcil construir um bom analisador sinttico para cdigo fonte C++ utilizando algoritmos clssicos como o LALR(1).[21] Por exemplo, com o LALR possvel analisar cdigo Java.[22] A flexibilidade da linguagem tambm fruto de ambiguidades que um analisador simples no consegue distinguir. Por esse motivo, existem poucas ferramentas para anlise e transformao no trivial de cdigo, como refatorao. Em suas primeiras especificaes o C++ era uma gramtica LALR, entretanto, com a adio de funcionalidades como espao de nomes, excees, gabaritos e o tipo bool, essa caracterstica logo se tornou invlida. [21] A anlise sinttica no a tarefa mais difcil na construo de uma ferramenta C++. Outras tarefas incluem entender o significado dos identificadores do programa que um compilador deve possuir. Sistemas prticos de processamento no devem somente analisar o cdigo fonte, mas tambm compreender exatamente cada identificador em diferentes usos, lidando com as regras de mbito de identificadores (ver um cdigo contextualizado em anexo). O grupo Boost possui um projeto para a construo de um analisador sinttico C++ com base na biblioteca Spirit,[23] de forma que se torna um mtodo padro e livre de anlise sinttica para a linguagem.

[editar] Exemplos de cdigo


Ver pgina anexa: Lista de exemplos de cdigo C++ Exemplo de um programa que imprime na tela "Ol, Mundo!".
#include <iostream> int main() { std::cout << "Ol, Mundo!" << std::endl; return 0; }

[editar] Crticas
O Wikiquote possui citaes de ou sobre: Bjarne Stroustrup

C faz com que dar um tiro no p seja fcil; C++ torna isso mais difcil, mas quando ns o fazemos arrebentamos com a perna toda.

Bjarne Stroustrup

A citao de Stroutrup trata com humor o fato de o C++, ao possibilitar a programao de alto nvel, ter facilitado a codificao de algoritmos e organizao de projetos em relao ao C, uma linguagem que requer constante ateno contra erros lgicos de programao devido sua alta flexibidade. Por outro lado, o C++ possui nuances da sintaxe e semntica da linguagem muito sutis, difceis de serem identificados, e que quando no percebidos podem levar a comportamentos indesejados no cdigo.

Pontos positivos do C++ incluem a produo de cdigo o quanto mais eficiente possvel, fazendo uso de otimizaes agressivas e sofisticadas dos compiladores. Entretanto, a linguagem ainda mantem alta flexibilidade, portabilidade e consistncia. Um exemplo da flexibilidade a possibilidade de programao de alto e baixo nvel. Outro exemplo a possibilidade de metaprogramao e programao genrica. Mais um ponto positivo ampla disponibilidade e suporte, devido principalmente grande base de desenvolvedores. Alm disso, a compatilidade com C, resultando em vasta base de cdigo. Fora do lado tcnico, um positivo que a linguagem no est sob o domnio duma empresa (em contraste do Java Sun Microsystems (atualmente pertencente a Oracle Corporation) ou Visual Basic Microsoft); a padronizao responsabilidade da ISO. Por outro lado, pontos negativos do C++ incluem grande perodo para o aprendizado devido complexidade da linguagem. Tambm, os compiladores atuais, que nem sempre produzem o cdigo mais otimizado, tanto em velocidade quanto tamanho do cdigo, e que geralmente produzem mensagens de erro difceis de serem interpretadas em problemas relacionados com gabaritos. Ainda relacionado a aprendizado e uso, a biblioteca padro no cobre reas importantes da programao, como threads, conexes TCP/IP, interface grfica e manipulao de sistemas de arquivos, o que implica na necessidade de criao de bibliotecas prprias para tal, que pecam em portabilidade e padronizao. Apesar da ampla base de cdigo legada do C, o C++ tambm herdou daquela linguagem problemas de entendimento de sintaxe do mesmo. Mais um ponto negativo que devido grande flexibilidade no desenvolvimento, recomendado o uso de padres de programao mais amplamente que em outras linguagens.

[editar] Comunidade de desenvolvimento


[editar] Pessoas notveis
O desenvolvimento da linguagem C++ fruto do trabalho de milhares de pessoas associadas academia e indstria de software, e pode consistir na utilizao da linguagem, em seu ensino, na construo de bibliotecas de rotinas ou na participao no comit de padronizao, entre outras atividades. Algumas pessoas tiveram participao fundamental durante a histria para o desenvolvimento.[24] Primeiramente, o prprio Bjarne Stroustrup, criador da linguagem e de seu primeiro compilador.[1] O cientista ainda participa na padronizao e divulga o C++ no meio acadmico. Andrew Koenig outro pesquisador notvel, bastante atuante na padronizao e creditado pela tcnica Koenig lookup (demonstrada em anexo). J Scott Meyers um doutor em cincia da computao, e escritor de diversos livros sobre o desenvolvimento de software utilizando a linguagem. Assim como Meyers, Herb Sutter escritor de diversos livros sobre C++ e centenas de colunas e artigos, e um notvel pesquisador sobre programao concorrente e multitarefa. Andrei Alexandrescu considerado um dos maiores especialistas em programao C++ avanada. Na rea de programao genrica destaca-se o programador russo Alexander Stepanov, a figura chave na criao da Standard Template Library.

[editar] Bibilioteca Boost


Ver artigo principal: Biblioteca Boost

Parte da comunidade de desenvolvimento do C++ foi responsvel pela criao da Boost, um conjunto de bibliotecas que estendem a funcionalidade da linguagem, mais especificamente, da bibilioteca padro. O processo de disponibilizao de bibliotecas da Boost mais rpido do que o do comit de padronizao da linguagem, e o projeto acaba servindo como uma forma de teste em campo das bibliotecas, que eventualmente podem ser migradas para a especificao da linguagem. Para o TR1 do C++0x, pelo menos dez bibliotecas j foram aceitas.[25] A base de usurios da Boost grande, o que reflete no controle de qualidade. Funcionalidades oferecidas vo desde bibliotecas gerais como smart_ptr[26] a abstraes do sistema operacional como o filesystem[27] a bibliotecas para usurios avanados como a MPL.[28]

[editar] Ferramentas
[editar] Ambientes de desenvolvimento
Abaixo mostrada uma lista dos principais ambientes de desenvolvimento C++, sejam eles compiladores ou ambientes de desenvolvimento integrado (IDE). Plataforma Nome Comentrio Tipo de licena compilador IDE depurador s ? ? ? Um componente Unix, do GCC, Linux, Mac G++ compilador Livre OS X, padro do Windows e Projecto GNU AmigaOS IDE livre famosa entre iniciantes. Seu Windows[not Dev-C++ compilador o Livre a 6] MinGW, uma verso do G++ para Windows. U++ um framework C++ multiplataforma, para Unix, desemvolviment Linux, Mac Ultimate++ Livre o rpido de OS X e aplicaes, Windows focado na produtividade de programadores. Produz cdigo otimizado para Windows e Intel C++ Proprietria processadores Linux Intel Microsoft o mais Proprietria Windows

Visual C++ conhecido para a plataforma Windows, com ferramentas e tecnologias auxiliares para desenvolviment o nessa plataforma (como MFC, ATL, COM, entre outras). Oferece ainda uma verso gratuita com restries de uso[29] Ferramenta da Embarcadero(er a da Borland) que compartilha a mesma IDE do Delphi chamada de RAD Studio, sendo possvel a utilizao dos mesmos C++ Builder componentes Proprietria visuais do Delphi(VCL) em um cdigo C++. J teve as verses 1, 2, 3, 4(1998), 5, 6(2002), 2006, 2007, 2009, 2010 e XE(2011). IDE especializada em (mas no restrita a) desenvolviment Livre/Proprietri Qt Creator o na plataforma a Qt. Utiliza o g++ como compilador e o gdb como depurador (ou

Windows

Linux, Windows e Mac OS X

seus equivalentes para MinGW em Windows). Suporta plataformas antigas, at Open ento sem Watcom suporte completo biblioteca padro Pode ser Comeau experimentado C++ pela Internet[30] Possui verso gratuita[31] no stio oficial e Turbo C++ tambm uma verso paga.[32] similar ao C++ Builder. Disponvel para C++ atravs da Eclipse extenso CDT.[33] Suporta muitas capacidades avanadas como gerenciamento de projetos e um poderoso editor de cdigo fonte. Anjuta Uma nova verso do Anjuta (Anjuta 2.*) que integra o Glade est em desenvolviment o ativo. Ambiente aberto e multiplataforma, em sua verso para Code::Block Windows utiliza s o compilador MinGW, apesar de tambm suportar outros

Livre

DOS, Windows, OS/2 e Netware

Proprietria

Windows, Linux e Solaris

Proprietria

Windows

Livre

Windows, Linux, JVM

Livre

Linux

Livre

Windows, Linux, Mac OS X

compiladores como o Visual C++, Digital Mars, Borland C++ 5.5 e Open Watcom.[34] Digital Mars Codelite Geany GNAT Utiliza o Programmin compilador g Studio GCC Utiliza o KDevelop compilador GCC Proprietria Livre Livre Livre Windows, DOS Windows, Linux, Mac OS X Windows, Linux Windows, Linux, Solaris Windows, Linux

Livre

[editar] Aplicativos desenvolvidos em C++


Abaixo segue uma lista de exemplos de aplicativos parcial ou totalmente escritos em C++, de acordo com Bjarne Stroustrup, que no garante sua preciso e veracidade, ainda que seja responsvel por sua publicao.[35]

Adobe Acrobat Adobe Illustrator Adobe Photoshop Amazon BeOS Blender Common Desktop Environment Doom III (motor de jogo) eMule Motores de busca Google, em especial Googlebot[36] Srie Half-Life Internet Explorer iPod (GUI) KDE (Qt) Lunar Magic Mac OS X

Maya Mars Pathfinder, Opportunity e outras sondas da NASA Microsoft Office Microsoft Visual Studio (Visual Basic, Visual FoxPro, Visual C++) Microsoft Windows (diversas verses) Mozilla Firefox Mozilla Thunderbird MySQL Mquina virtual Java LibreOffice Outlook Express PCSX2 (Emulador de Playstation 2) SETI@home Symbian OS Winamp Tibia

Você também pode gostar