細数C++とCの違い

3659 ワード

C++言語はC言語への拡張である.だからC言語に詳しい人は、本書の第01~18章の内容は基本的にC言語の内容とあまり差がないことに気づきます.C++はC言語の文法を修正する一方で、新しい概念を追加します.
C++に新たに追加された概念は,boolタイプ,引用(14章),クラス(19~24章),テンプレート(25~26章),異常(27章)である.
C++がCに対して変化する構文点は,変数分散定義,関数名リロード,struct構文である.本章では,これらの変化する文法点を比較分析することに重点を置いている.
本編は『C/C++学習ガイド』より選ばれ、付録14
権利声明:著者は本書のすべての権利を持っている.作者はいかなる人がすべて自由に当サイトの発表の内容を転載することができることを授権して、しかし転載する時必ず以下の制限を守らなければなりません:①転載する時必ず全文転載しなければならなくて、いかなる修正があってはいけなくて、必ず“権利声明”と“公式サイトの住所”②ネットの転載だけを含んで、つまり最終結の結果はネット上で公表します.以上の2つの転載行為を遵守しないことを権利侵害行為と見なす.本人の許可を得ない限り、誰も本サイトのコンテンツを他の用途に使用してはならない.公式サイトのアドレス:http://www.afanihao.cn/メッセージをどうぞhttp://www.afanihao.cn/kbase/ 
 
1.1プロジェクトにcファイルを追加する
ファイルとしてcを接尾辞とする場合、コンパイラはC言語の文法でこのファイルをコンパイルする.ファイルとしてcppを接尾辞とする場合,コンパイラはC++の構文基準でコンパイルする.したがって,ファイルの接尾辞名にはこの約束があり,勝手に変更することはできない.
ファイルを追加するときに入力ファイル名の接尾辞は.c,それはこのファイルを編集するときにC言語の文法を守らなければならない.下図に示すように、
1.2変数分散定義
この点は8章で紹介する関数で少し紹介する.
C言語では、すべてのローカル変数を関数または複合文の一番前のセットで定義する必要があります.簡単に言えば、変数定義文を前に置く必要があります.さもないと文法の間違いを報告します.
次のmain.c(C言語)コードでは、局所変数a,bはいずれも関数体の前部で定義されているため、C言語の文法要求に合致し、
////////////// main.c //////////
#include <stdio.h>
void main()
{
      int a;  //     
      int b;  //     
 
      a = 10;
      printf("a=%d 
", a); b = 11; printf("b=%d
", b); }

次のmain.c(C言語)コードでは、局所変数cの定義は前に置かれず、C言語の文法要求に合致しないため、コンパイルエラーが発生し、
////////////// main.c //////////
#include <stdio.h>
void main()
{
      int a;  //     
      int b;  //     
 
      a = 10;
      printf("a=%d 
", a); b = 11; printf("b=%d
", b); int c ; // c = a + b; printf("c=%d
", c); }

明らかに、これはプログラマーにとって不便です.そこでC++言語はこの制限を取り除き,プログラマがいつでもどこでも変数を定義できるようにした.
1.3関数名の再ロード
C++は、複数の関数が同じ関数を使用することを可能にし、これを関数名リロードと呼ぶ.これはC言語では絶対にできません.C言語では、グローバル関数名を繰り返すことはできません.例えば、以下のmain.cファイルには、同じ名前のグローバル関数do_が2つ存在します.コンパイラのエラーが発生しました
////////////// main.c //////////
#include <stdio.h>
 
void do_something(int x, int y)
{
      printf("int , int 
"); } void do_something(double x, double y) { printf("double , double
"); } void main() { printf("test"); }

この問題の本質は,C言語において,関数名で1つのグローバル関数を一意に区別することである.言い換えれば、関数名は関数の唯一のIDであり、明らかにIDというものは衝突できない.
これにより、C言語では、関数に名前を付けるのも面倒なことになり、機能が似ている関数については、同じ名前を付けることができないので、区別を示すために接尾辞を付け続けるだけです.例えば、
do_something_int_int()
do_something_double_double()
 
もしあなたが将来いくつかのC言語のコードを読むならば、この感じがあると信じています.
C++この問題に対する改善点は,関数名+パラメータリストで関数を一意に区別することである.したがって、C++では、パラメータリストが異なる限り、関数名は同じになります.
 
1.4 struct定義
C言語ではstructタイプの定義にstructの接頭辞を付ける必要があります.
C++ではstructはそのタイプ名を直接使用して定義できます
それに比べて、C++の文法はもっと簡潔だと思います.だからC言語でコードを書くとき、struct接頭辞を付けるのはうんざりするので、Cプログラマーは通常このようにstructを定義します.次のコードではtypedefを使用してobject_を定義します.tのタイプは、
C言語の世界では、structを一般的なモードと定義し、使用時にstruct接頭辞を1つ少なく書くためです.(Cプログラマーがどんなに耐えられないかがわかる).
チェーンテーブルを定義する必要がある場合、Cプログラマーには2つの書き方があります.
struct  Object
{
     int id;
     struct Object * next;  //
};
 
typedef struct  _tag_object
{
     int id;
     struct _tag_object * next;
}object_t;

同様に、Cプログラマーは2つ目の定義方法を選択します.唯一の目的は、使用時にキーワードstructを1つ少なく書くことです.      
1.5 C++のstruct
実際、C++はstructを全面的にアップグレードし、C++のstructはclassの文法にほぼ完全に等価になった.メンバー関数、public/private、継承など、classがサポートする構文は、structもすべてサポートされ、意味は変わりません.すなわちstructはclassの同義語(少し差があり、後述)である.
唯一の小さな違い:structの場合、変更子(public/protected/private)が宣言されていない場合、デフォルトのすべてのメンバーはpublicです.この点ではclassとは逆にclassのデフォルトはprivateです.