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