Escolar Documentos
Profissional Documentos
Cultura Documentos
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)
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.
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] 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]).
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.
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.
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] 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.
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
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
Proprietria
Proprietria
Windows
Livre
Livre
Linux
Livre
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
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