ぼんさい塾

ぼんさいノートと補遺に関する素材や注釈です.ミスが多いので初稿から1週間を経た重要な修正のみ最終更新日を残しています.

Cから見たC++ (0)

2010-10-07 22:13:17 | 暮らし
記事一覧(Cの文法(1)~(17),他)
まず覚えるCの文法(progC.pdf)

P0: Cの構造体と専用の関数
//-------------------------------------
#include <stdio.h>
#include <string.h>
typedef struct{
  int id; char name[10]; char mail[30];
} member;
member igo[10]={
  {1, "Aoki", "aoki@xxx.ne.jp"},
  {2, "Itoh", "taro@yyy.jp"}
};
//-------------------------------------
typedef struct{
  member *top; int max;
} group;
group g_igo={&igo[0], 10};
member *addr(group *g, int i){
  member *p=g->top; int k;
  for(k=0; k<g->max; k++,p++){
    if(p->id==i || p->id==0){break;}
  }
  if(k<g->max){return p;}
  else{return NULL;}
}
void show(group *g, int i){
  member *p=addr(g, i);
  if(p->id==i){
    printf("%d, %s, %s\n", 
           p->id, p->name, p->mail);
  }else{printf("?\n");}
}
void add(group *g, 
         int i, char *n, char *m){
  member *p=addr(g, i);
  if(p!=NULL && p->id==0){
    p->id=i;
    strcpy(p->name, n);
    strcpy(p->mail, m);
  }else{printf("-\n");}
}
void del(group *g, int i){
  member *p=addr(g, i), *q;
  if(p!=NULL && p->id==i){
    q=addr(g, 0); q--;
    if(q!=p && q->id!=0){
      p->id=q->id;
      strcpy(p->name, q->name);
      strcpy(p->mail, q->mail);
    }else{q=p;}
    q->id=0;
    q->name[0]=q->mail[0]='\0';
  }else{printf("?\n");}
}
//-------------------------------------
int main(void){
  member *p;
  add(&g_igo, 5,
      "Tanaka", "foo@zzz.ac.jp");
  for(p=g_igo.top; p->id!=0; p++){
    show(&g_igo, p->id);
  }
  del(&g_igo, 2);
  for(p=g_igo.top; p->id!=0; p++){
    show(&g_igo, p->id);
  }
  return 0;
}
//-------------------------------------

0. はじめに

C言語の知識を前提としてC++の概要を

1.基本クラス
2.派生クラス
3.多重定義
4.その他(10/15変更)

の順に説明します.したがって

#include <iostream.h>
int main(void){
  cout << "Hello, world";
  return 0;
}

の「iostream.h」「cout」等の説明は最後になります.

Cの代わりにC++を使う最大の利点は,基本クラスで
作られたプログラムを変更することなく,派生クラス
で機能を拡張できることです.
  簡単な例として「Cの文法(16)」で宣言した構造体
group を基本クラスに変更して,段位のデータ等を付
加した派生クラスを作ってみましょう.

準備として「Cの文法」で考えた P0 のプログラムを
復習しておいてください.なお,Cでも

  member *addr(group *g, int i);
  void show(group *g, int i);
  void add(group *g, int i, char *n, char *m);
  void del(group *g, int i);

あるいは

  member *addr(group*, int);
  void show(group*, int);
  void add(group*, int, char*, char*);
  void del(group*, int);

のような宣言文(プロトタイプ宣言)があります.C
のコンパイラは関数の定義の前に呼び出しが書かれて
いると int 型の関数として処理してしまいますが,
冒頭に上記の宣言文をおくと,関数の定義を main()
の後で書いても正しくコンパイルされます.また,大
きなプログラムを複数のファイルに分割してコンパイ
ルするときには,このような表現は必須です(先頭に
「extrn」を付けます)(@46).
  クラスの宣言に類似の表現を使うので,ついでに覚
えておきましょう.

参考:オブジェクト指向プログラミングの特徴や歴史
は[0-1]で説明されていますが,とりあえずオブジェク
トとはデータメンバだけで構成される構造体にメンバ
関数を付加したものと考えればいいでしょう.派生ク
ラスではデータメンバの追加やメンバ関数の変更・追
加が行われます.メンバ関数の扱いに興味のある人は
[0-2]を勉強してください.
[0-1] オブジェクト指向プログラミング - Wikipedia
[0-2] 仮想関数テーブル - Wikipedia
[0-3] 柴田望洋,プログラミング講義C++
[0-4] 講義資料(圧縮ファイル)