そもそもC++ってなんじゃ

Cに各種機能をつけたした感じです。割と名前のまんま。
だから、Cを書ける人はC++も書けるってこと?
ですが、「このソース、C++っぽくないね」とかいろいろ言いませんか?
じゃやっぱり、CとC++は違うんだろうか?

ようするに、Cで書いたものもC++コンパイラでコンパイルできるだけ。
それは「Cを書いてC++コンパイラでコンパイルさせただけで、C++を書いたとは言わない」と思います。
ということでやっぱりC++はC++なんじゃないかと。

では、なぜC++を使うのかという疑問があるはず。
結論はもっと簡単になるからに尽きるのかなと。
それはコーディングにおいても部品化においてもきっと楽になるからだと。

でもやっぱりC言語の延長で勉強したいです

ってのが一般的じゃないかなぁ。
C++の元がCなわけで、たいていのC++の本もまずはCの解説からはいるものがほとんど。
これだと致命的なまでにCとC++の違いがわからない状態に陥るわけで。
で、この文章をちょっくら書いてみようかと思った次第

Cへの細かい追加機能みたいな部分

プリプロセッサに追加されたって思えば理解が深まると思う。
だから拡張されたCコンパイラだと使える機能はかなりある。
プリプロセッサって何?って人は勝手に勉強しれ。

キャスト
C++になってもCシステムで逃れられないところ。
書き方が追加されているだけかも。

(int)(x/y)
int(x/y)
	

コメント
これもただ書き方が追加されているだけ。
C言語コンパイラで通るものもかなりあるけど、コンパイラ依存なのでやめたほうがいいかも?とか思ったりしてても楽なので使ってしまうかんじ。

// コメント
	

インライン関数
細かいことがうるさくないマクロのような感じ。
マクロでバグるアホはインライン関数を使えと思ってる。

○デファインでよくバグる例
#define square(x) ((x)*(x))
z = square(--x);

展開すると
z = square((--x)*(--x));

○インラインならよく考えないでもうまくいく例
inline int square(x){
	return ((x)*(x));
}
z = square(--x);

展開すると
{
	int __temp = --x;
	z = __temp * __temp;
}
	

参照
そのまま使うことはあまりないかも?
オペレータとか使い始めるとすごい能力を発揮し始める感じ。
これがきれいに使えるようになったらC++っぽいソースを書き始めてるカモ

int& x = y;
	

デフォルト引数
関数の引数を省略して呼び出したときに、初期値にこの値が入ってる。

int function(int x, int y = 0);
	

オーバーロード(多重定義)
名前が同じでも、引数が違えば違う関数として定義できる。
これがかなり便利。プログラムの保守としても便利だし、なにより関数名考えるのがプログラムで一番時間かかるって時あるじゃない?
C++の実装としては、引数の型までシンボル化するから平気っぽい。

long func(long x)
short func(short x)

シンボル化するとこんな感じ
FUNC_LONG(x)
FUNC_SHORT(x)

オブジェクト概念の追加

クラスって言うのが追加されています。
C++のクラスってのは単純に、メンバ変数とメンバ関数(メンバとメソッド)がひとつになっていて、隠蔽するとか、部品化するとか、なんだかんだ言われてますけど、そんなのは書ける人はC言語時代から出来てたことなんです。
ではC++とCとの大いなる差ってのは何か?ってことのお話。

コンストラクタが追加されています。
コンストラクタっていうのは、そのクラスが生成されたときに、自動実行される関数ですな。
つまりメンバの初期化とかを、クラスのインスタンス生成のときに勝手に実行してくれる素敵な機能。

デストラクタってのが追加されています。
こっちは逆に、そのインスタンスが消滅するときに、自動実行される関数で、まぁメモリリークとかなくそうとする試みですかなぁ?

関数の引数や戻り値に、クラスを指定できる。
これが普通に素敵ですね。
C時代ではポインタをつかってやり取りしていたもんですが、C++ではできるようになりました。
これはコピーコンストラクタとかの機能が追加されたおかげで出来るようになった技術です。

ちなみに、C++の構造体とクラスの差って何だと思います?
クラスにはメンバ関数を書ける?
いえいえ、構造体にもメンバ関数が書けるように拡張されていますよ。
答えは、デフォルトがpublicなのかprivateなのかでしかない。

より生成的にするために

こっからはもう難しい話に・・・なって・・・く・・・る・・・

テンプレートってのがありますな、C時代の構造体が新しい変数を生成するための雛形だとすれば、テンプレートは新しいクラスを生成するための雛形ってところでしょう。
「インスタンスを作るための雛形であるクラス」を作るための雛形であるテンプレート。といったところです。
似たような構造のクラスを作るならその構造部分を雛形化してしまえ、そんでその雛形からクラスを作ればいいやん。
っていうこと。
継承に似ているけれど、こっちはもっと動作構造だけを雛形化するとかの違いがあるわけで、でもたいていは継承のほうが具体的で理解しやすいから継承の考え方しか出来なくなっちゃったり、もったいない機能。
だから、あんまりテンプレートを作ることはないかもしれないけど、使うと楽ってことはあるわけで。
STLとかでかなりの基本テンプレートが実装されていますから調べるとプログラムテクニックのランクが上がるかも?

template  class Stack
{
	int	size;
	T*	ptr;
	T*	top;

public:
	Stack(int n){
		ptr = top = new T [n];
		size = ptr ? n : 0;
	}

	~Stack(){
		delete[] ptr;
	}

	void Push(T x){
		if(ptr - top < size)
			*top++ = x;
	}

	T	Pop(void){
		return (top>ptr) ? *--top : 0;
	}

};
	

継承ってのは、・・・そろそろもう説明めんどくなってきたのだが・・・、複数のクラスで同じ動作をするならまとめちゃえ!っていうこと。
本来はそういうつもりじゃないはずだけど、まぁボトムアップ的な考えのほうがとりあえず勉強しやすいのでそういうことで。

まとめ

今回とくに言うことないかも・・・
CとC++は似ているけれども、プログラマは本質的な考え方を切り替えともっと素敵って事が言いたかったのか?俺。
まぁ、CとC++の根本理解じゃなくても、理解が深まってくれる人がいることを望む。