記事一覧(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] 講義資料(圧縮ファイル) |