Pergunta

Fui aprendendo C em Varsity para pouco menos de dois meses agora, e no próximo ano estaremos passando para C ++.

Existem hábitos que eu deveria entrar com a minha programação C que irá ajudar a transição para C ++ no futuro, ou é melhor pensar deles completamente separadamente?

Quando você aprendeu C, em seguida, C ++, fez da maneira que você codificado em mudança C de alguma forma?

Foi útil?

Solução

Já há um monte de boas respostas. A minha será mais "mentalidade orientada".

Dados vs. Ação!

  • Em C, tudo é feito a pensar como "Aplicar este efeito a esses dados".
  • Em C ++, este é mais como "Dados devem se comportar".

Enquanto o "Data deve se comportar" pode ser feito em C (e é feito!), Em C ++, tudo o necessário para implementar isso facilmente já está acessível: encapsulamento, construtores, sobrecarregando substituindo, modelos, etc ..

eu encontrei este "Dados deve se comportar" ideia muito bom princípio orientador quando codificação em C ++.

açúcar sintático C ++ não é opcional

Você vai encontrar um monte de recursos C ++ que poderia ser feito em C, e algumas pessoas usá-lo como uma desculpa para não aprender. Essa mentalidade é perigoso (esta é a parte " deleite C ++ como uma nova linguagem, e não uma extensão " visto em alguns lugares).

Um efeito colateral de evitar escrever C ++ a C maneira ++ é que, enquanto desenvolvedor de um C ++ é suposto para entender o código C ++, ele / ela não é suposto compreender o seu quadro de pessoal pouco imitando açúcar C ++ com C-apenas características. Na verdade, ele / ela não vai estar interessado pelo seu quadro. Verdade seja dita, ele / ela só vai sentir pena / desprezo por você, porque você perdeu um tempo precioso produzir isso. Em última análise, ele / ela vai odiá-lo se ele / ela deve usar sua estrutura, em vez do açúcar C ++.

Os princípios orientadores como "Eu posso fazer desta forma a C" só vai fazer você perder a carroça. Melhor não começar a aprender C ++ em todos, se você já tem esse tipo de modo C-centric de pensar.

O seu idioma de escolha nunca é o melhor. Você é suposto para se tornar o melhor. Se você escrever código C ++, em seguida, escrevê-lo do caminho C ++.

código C

C-compatível ++ é um erro de semântica

Typedefing suas estruturas para torná-los compilable por um compilador C é uma piada de mau gosto. Usando ponteiros em vez de referências é um tapa para o seu próprio futuro. O extern "C" só vai fazer seu código mais fraco, não mais forte. E usando void * para genericidade só vai aumentar o número de codificadores companheiros C ++ que terão prazer em pagar para ter sua cabeça removida de uma maneira espetacularmente doloroso.

Não nunca se preocuparam em escrever código C compatível com a menos que você realmente realmente tem que.

Você vai apenas pesar-se para baixo com um demorado estilo de codificação para um recurso que você nunca vai usar.

O compilador é um amigo poderoso / inimigo

Working baixo nível tem efeitos estranhos em alguns desenvolvedores. Eles acreditam muito em seu controle sobre o código compilado. Delegando este controle para construções de alto nível é difícil para eles.

Um bom exemplo de que está deixando de lado o padrão de construtor / destruidor porque ", por vezes, os construtores leva muito tempo ... É melhor fazer do meu jeito ... ".

compilador O C ++ é bastante capaz de otimizar o código aparentemente unoptimized. Na verdade, o código produzido pelo compilador pode ser bastante diferente da que você acredita que você produziu.

Não tente ser melhor / mais esperto do que o compilador é porque:

  1. Você provavelmente já perdeu a luta, como até mesmo compiladores antigos geralmente irá produzir um código melhor do que você pode sonhar fazer hoje
  2. Mesmo se você não ganhar a luta de hoje, ele vai se transformar automaticamente em uma derrota amanhã, como compiladores vai se tornar melhor e melhor no futuro, para que o seu "código otimizado" de hoje vai se tornar o gargalo programa e refatoração assunto do próximos anos (não mencionando memórias vergonhosos para você).

Assim, confiar em seu compilador.

Do not gerenciar a produção de seu código. Faça o seu próprio trabalho, e deixar o compilador fazer o seu próprio.

Note que este ponto não deve ser utilizado para justificar a produção de código lento / ineficiente. Se otimização prematura é a raiz de todo o mal, você ainda deve usar seu conhecimento da língua e o compilador para produzir bons e código eficiente (vero próximo ponto).

saber as vantagens / drowbacks / custos de cada C ++ construo

Por exemplo, o fato de métodos virtuais adiciona um engano para os meios de chamada de função para algumas pessoas que o desempenho irá diminuir drasticamente. A verdade é que os problemas de desempenho são muitas vezes em outros lugares.

A ignorância não é desculpa.

Conhecer o código produzido para cada construo C ++ (isto é inline, referências, construtor, destruidor, excepção, a sobrecarga de função, a função de sobreposição, modelo, função virtual, etc). Saiba o que será otimizado de distância, e que não vai.

Desta forma, não só você não vai pagar por aquilo que você não precisa (este é um princípio orientador do C ++), mas você também vai lucrar com o que lhe custa zero, mas traz para você um monte.

Seja humilde

Há pessoas que fazem a pesquisa em C ++ que eram melhores em C ++ o dia de seu nascimento do que a maioria de nós nunca vai ser. Mesmo se ignorarmos Stroustrup , nomes como Meyers , Abrahams , Alexandrescu , Sutter , etc. cortar regularmente ao lado de novas ideias. Apesar (ou como consequência de) sua perspectiva alienígena, STL é uma biblioteca revolucionária. E uma biblioteca como impulso , apesar de seu "tamanho pequeno", quando comparado com algumas estruturas completas (como Java ou .NET APIs ), é um repositório enorme de excelente código oferecido a você para estudar.

Só porque você encontrar alguma novidade "estranha" ou "alien", não subestime-lo. Tentando entender que talvez lhe trazer mais uma ferramenta à sua disposição, e será sempre aumentar o seu domínio da língua, e sempre vai fazer o seu trabalho de cérebro, o que é uma coisa boa no negócio desenv.

A maioria das pessoas que eu conheço que não conseguiram a sua "conversão para C ++" só assumiu este ou esse recurso foi inútil, porque eles não se preocuparam em compreendê-lo.

RAII !!!!

Se você não sabe o que é, aprendê-lo.

Sem RAII, o seu código de C ++ é código apenas grampeado que evitou erro de compilação.

RAII é a noção mais importante de C ++.

Tudo o resto está relacionado.

Outras dicas

O melhor conselho é provavelmente a tratá-los como línguas completamente distintas. Sim, a maioria de código C pode ser compilado por um compilador C ++, mas geralmente não é um bom caminho a percorrer.

C é muito mais um idioma hackery de baixo nível. O que você vê é o que você ganha. Ele tem ponteiros e estruturas, para que usar ponteiros e estruturas. Tem muito pouca segurança de tipo, então você ignorar a segurança de tipos, tanto quanto possível.

C ++, por outro lado, permite que um grande número de abstrações. Ao invés de ponteiros, você normalmente quer iterators de uso, que se comportam conceitualmente como ponteiros, mas não são (ou não ser).

Em vez de jogar fora informações de tipo (por exemplo, com função aceitar um * vazio assim que vou trabalhar com qualquer tipo de ponteiro), você pode usar modelos para manter a segurança de tipos e ainda ser capaz de reutilizar a mesma definição de função única.

E você está dado uma excelente biblioteca padrão que permite expressar algoritmos complexos em termos de simples predefinidos blocos de construção.

C ++ é uma linguagem multi-paradigma. Algumas respostas aqui disseram que C ++ é orientada a objeto, que é parcialmente verdadeiro. Ele tem suporte para código orientado a objetos, sim, mas não é isso que C ++ é .

C ++ também tem suporte para programação genérica, que muitas vezes é preferível sobre OOP. Tem algum suporte limitado para a programação funcional também. E, claro, ele ainda tem suporte para programação processual de estilo C também. O truque em C ++ é entender tudo isso, então você sabe que para usar quando. Essa é a força do C ++, a capacidade de alternar entre e misture todos esses paradigmas. Pessoas que chamam C ++ uma falta linguagem OOP o ponto tanto quanto as pessoas que o chamam de uma melhor C. Ele permite que você escrever código em qualquer um desses estilos, mas nenhum deles são realmente vale a pena em si mesmos. C é um melhor C-como a linguagem, e há uma abundância de melhores linguagens OOP. Se você quiser ficar com um único paradigma, usar uma linguagem projetada para isso.

Engraçado como muitas pessoas aqui dizem que C e C ++ são "completamente diferente", e como "C ++ é orientada a objeto, C não é" ...

Primeiro: C ++ foi inicialmente concebido como uma extensão da linguagem C. Na verdade, o C ++ documentação padrão refere-se para o padrão C. É verdade que muitas coisas são feitas diferente em C ++ do que em C, mas a afirmação de que os dois são completamente disjuntos vai um pouco longe. Bom código C pode ser compilado com um compilador C ++, e para alguns problemas triviais, soluções C e C ++ pode olhar ao lado idênticas.

Em segundo lugar, não se deixe ser enganado em acreditar que C ++ é "uma linguagem orientada a objeto". C ++ é uma linguagem que suportes orientação a objetos, é verdade. Mas ele também suporta programação genérica, e programação procedural. Centrando-se apenas no aspecto OOP de C ++ tira muito do seu poder.

Quanto aos hábitos de entrar ... não se tornam muito ligado às cordas de estilo C (char *) e matrizes (int foo[]). Ambos são muito raramente usados ??em C ++, como existem as substituições muito mais poderoso (e conveniente), string e vector.

Preste atenção aos ponteiros, e alocações de memória dinâmica. Enquanto bom código C ++ tem muito pouco deles, você tem que estar ciente de como eles funcionam. Enquanto isso, você também vai perceber Por bom código C ++ encapsules-los ou substitui-los com referências, para que eles não aparecem muito no código de produção-qualidade.

Ao projetar seu código C, comece com uma struct segurando dados relevantes (por exemplo, campos de um endereço), e então construir funções que trabalham com esse tipo de struct (address_read( struct address_t * ), address_write( struct address_t * ), address_modify_name( struct address_t *, char * ) etc.). Adicionar a função main() que chama essas funções de forma adequada passado. Os dados são a parte mais importante do programa, não a função. Isso é algo que vai fazer a passo para C ++ (e orientação a objetos) mais fácil.

Há mais, mas eu não reivindico estar respondendo tudo em um post SO. : -)

Se você pode se apossar dela eu recomendo os 3 primeiros capítulos do O C ++ Linguagem de programação pelo criador do C ++ Bjarne Stroustrup.

Em particular, o "Notas para o leitor" e "Tour de C ++" lhe dará uma boa compreensão de onde / como difere C ++ de C e se concentrar ainda mais a sua aprendizagem. É claro que todo o livro é útil ter por perto quando trabalhar com C ++.

Curiosamente para a sua situação, no capítulo 1, Bjarne realmente diz

"no debate contínuo sobre se é preciso aprender C antes de C ++, estou firmemente convencido de que é melhor ir diretamente para C ++".

Claro que ele, não seria ele, mas se você aceitar seu raciocínio que você seria melhor ir direto para C ++, o mais rapidamente possível.

Mantenha as línguas separadas.

C e C ++ pode ser parecem semelhantes, mas eles são diferentes línguas com regras diferentes para construções semelhantes. Se você pode isolar um do outro, tanto melhor.

Ao comutar para C ++ estar pronto para desaprenderem (aprender um diferente, método incompatível) sobre: ??

  1. pré-processador :. Em C ++ você não deve usar o pré-processador, tanto quanto em C
  2. cordas : C não tê-los
  3. ponteiros : C ++ podem ser codificados para lidar com eles de forma mais segura

Você está mudando a meios C ++ que você sentiu que precisava de classes, ou melhores bibliotecas. Isso é o que sinto. Eu também estou aprendendo melhores características de C ++, com o meu fundo C. Uptil agora, eu tive uma olhada vetores, principalmente, [para além de classes e modelos].

Eu sinto as línguas são muito semelhante ao

pensar neles completamente separadamente.

O meu palpite é que o C ++ você estará aprendendo provavelmente não vai ser excessivamente orientada a objeto, pelo menos, não estava na minha universidade de qualquer maneira. Corremos programas em C ++ essencialmente como programas C.

Definitivamente ler sobre como as classes podem ser implementadas, juntamente com a compreensão dos conceitos básicos de ponteiros.

Seu arquivo I / manuseio O será diferente, bem ... em vez de fstream ler sobre a sintaxe da implementação das funções iostream.

vasculhar a web para tutoriais sobre programas simples de C ++ ... CodeProject é sempre um bom recurso.

programas em C ++ são totalmente diferentes. é melhor gastar seu tempo aprendendo C ++ do que trabalhar em elementos C tentando melhorá-los para C ++.

Por exemplo, mesmo o programa 'Olá Mundo' simples, difere consideravelmente:

C:

#include <stdio.h>
int main(void)
{
  printf("Hello, world!\n");
  return 0;
}

C ++:

#include <iostream>
int main()
{
   std::cout << "Hello, world!\n";
}

(Exemplos de aqui ).

Como 'printf' é uma função enquanto 'cout' não é uma função, mas uma instância de uma classe ostream.

Além disso leitura:. iostream

Utilize estruturas e ponteiros de função, tanto quanto possível para imitar os métodos das classes e os métodos abstratos.

Por exemplo, se você quiser definir um veículo, e um carro derivado do veículo usando C, você escreveria (desculpe, eu não irá verificar o código :-)):

struct Vehicle
  {
  void (*checkFuel)(Vehicle*);
  void (*start)(Vehicle*);
  void (*move)(Vehicle*);
  void (*stop)(Vehicle*);
  }

void start1(Vehicle* v)
  {
  v->checkFuel(v);
  printf("START!");
  }

void start2(Vehicle* v)
  {
  v->checkFuel(v);
  printf("VROOOOMM!");
  }


struct Car
  {
  Vehicule base;
  int (*klaxon)(Car*);
  }

Vehicule* newVehicule()
 {
 Vehicule* v=(Vehicule*)malloc(sizeof(Vehicule));
 v->start= start1;
 v->move=
 (...)
 return v;
 }


Car* newCar()
 {
 Car* c=(Car*)malloc(sizeof(Car));
 Vehicule* v=(Vehicule*)c;
 v->start= start2;
 v->move=
 (...)
 c->kaxon=(...)
 return c;
 }

Aqui estão alguns pontos:

1) Certifique-se de que você é proficiente em ponteiros. Foco em como arrays e ponteiros obras, quais são as semelhanças e diferenças entre eles.

2) A melhor maneira de perfeita c é para escrever programas. Escreva como muitos como você pode. Para iniciantes você pode escrever funções personalizadas para alguns dos functions.You biblioteca pode tentar suas mãos em Strcpy, strcmp, strncpy, memcpy, memmove.

3) Aprenda a depuração. (GDB é muito legal).

4) começar a seguir um estilo de codificação particular e tentar ficar com ela.

5) Sempre fornecer o seu código com comentários significativos.

C ++ é objeto orientado, C não é. coisas tão comuns como manter código ponteiro limpo e comentário de em funções / métodos e entender como não se laços de pré-processamento infinitas usando #ifdefs.

No entanto, a abordagem objeto orientado muitas vezes pode ser mais agradável para realmente pensar código sobre objetos. Então você precisa pensar sobre os novos recursos diferença.

O estilo de programar em C e C ++ são totalmente diferentes. C ++ é orientada a objectos de programação como onde C é um procedimento de programação orientada. programação C ++ é o melhor em simulação de problemas do mundo real usando classes / objetos. Mas, conceitos básicos como ponteiros, estruturas, operadores, lançando operadores, manipulação de dados são os mesmos em ambos .. Sturctures e as aulas são conceito semelhante, mas não exatamente .. assim você pode se concentrar em programar usando estruturas, ponteiros, operadores e gerenciamento de memória, enquanto você está aprendendo na 'C'

Ponteiros de função. Google primeiro hit .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top