Download - C++入門?
C++入門?
LTDD広島#2
2014/4/5
@tsuda_ahr
自己紹介
昔から C++ の入門書に違和感があったので、
ちょっとそれについてまとめてみました。
注意!
これから話す内容は個人的な感想であって、
正確性とか妥当性とかは一切検証していません。
CのHello World
#include <stdio.h>
int main(void)
{
printf("Hello, world!");
return 0;
}
出典 http://ja.wikipedia.org/wiki/Hello worldプログラムの一覧
hello_1.c
実行
動く。
C++のHello World
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
}
// return がないのはいいのか?・・・
出典 http://ja.wikipedia.org/wiki/Hello worldプログラムの一覧
hello_2.cpp
は?
なにこれ?
なんでこんなに違うわけ?
わけわかんない!
とりあえず実行
まあ、動く。
Cのコードだとダメなわけ?
#include <stdio.h>
int main(void)
{
printf("Hello, world!");
return 0;
}
出典 http://ja.wikipedia.org/wiki/Hello worldプログラムの一覧
hello_3.cpp
CのコードをC++でコンパイルして実行!
動くやん!
なぜだ!
なぜ C と同じコードじゃないんだ?
調べた
C++ では新しい入出力機能が存在していますから、
それを使うのが C++らしい書き方です。
ということらしいです。
出典 http://www.geocities.jp/ky_webid/ProgrammingPlacePlus/cpp/language/001.html
なにが C++ らしいのか?
#include <iostream>
int main()
{
std::cout << "Hello, world!" << std::endl;
}
Iostreamライブラリ
“.h“ がついてない
名前空間
標準出力ストリームグローバルオブジェクト
出力演算子
行を終了し、バッファをフラッシュするオブジェクト?
なんかもりだくさん。
実はオーバーロード
ところで
<<
出力演算子って何?
出典 ストラウストラップのプログラミング入門
<<って言ったら C 的には
左シフトじゃないの?
演算子オーバーロード
<< を演算子オーバーロードし、
<< を実行すると、左シフトではなく、
別の処理を実行するようにしている。
# cout の場合は標準出力へ出力する。
要するに C++ では演算子がどのような演算をするかをプログラムで指定する仕組みがあり、それで演算子の動作を変えている。
盛りだくさんです。
おなかいっぱい。
Hello World ごときで
こんなに盛るなよ(汗
ところで
C++ で C でいう以下のコード場合どう書けばいいんすか?
#include <stdio.h>
int main(void)
{
printf("%7.2f %02x", 12.3, 10);
return 0;
}
調べた
でも大丈夫です。C++ は C と互換性があるのでコード内で
cout と printf をごちゃ混ぜにしても良いのです。簡単な出力やデバッグには cout 、
計算結果など小数のフォーマットをそろえたいときは printf と使い分ければ
問題ありません。
出典 http://www.flow.cs.is.nagoya-u.ac.jp/hamada/programming/cpp2.html
じゃあ最初から printf でいいじゃねーかよ(汗
そのほうがひとつですむじゃん(汗
cout いらねーじゃん(汗
まとめ
言語の力を誇示するのはやめましょう。
具体的には、
・無用なクラス/関数を作ったり
・無駄に演算子オーバーロードを使ったりすると
・可読性を落とすだけで利点なし
という結果に堕ちる場合があるので注意します。
特に!
<< を演算子を、本来の左シフトからまったく意味が異なる機能に差し替えるなどは、百害あって一利なし。(個人的見解)
演算子オーバーロードを使用するときには、元の演算子の機能を踏まえたうえで実装するよう注意しましょう。
(通常のオーバーロードやオーバーライドするときも同様ですが)
ご清聴ありがとうございました
参考1) cout による書式設定
別に cout が書式設定できないわけではないようです。
出典 http://msdn.microsoft.com/ja-jp/library/420970az.aspx
#include <iostream>#include <iomanip>
using namespace std;
int main(){
cout << setiosflags(ios::fixed);
cout << setw(7);cout << setprecision(2);cout << 12.3;cout << " ";
cout.fill('0');cout << setw(2);cout << hex;cout << 10;
}
参考2) もっとも美しきクソコード (個人的見解)
void strcpy (char *s, char *t)
{
while (*s++ = *t++)
;
}
出典 プログラミング言語C