C言語とC++って何が違うの?
これは修正すべき点がいくつもあるため、近いうちに修正します。(西暦2021年11月27日追記)
CとC++の違い
Wikipediaにも書いてあるように、C++は 1983年にベル研究所のコンピュータ科学者のビャーネ・ストロヴストルップが、 C言語の拡張として開発しました。 拡張はクラスの追加に始まり、仮想関数、多重定義、多重継承、 テンプレート、例外処理といった機能がどんどん追加されていきました。
C++での入出力関数
舐めてもらっちゃ困るな!
#include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
これをC++で書くと、どんな感じになるかというと…
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; return 0; }
iostreamについて
iostream
って何?
printf
、 文字列を入力するときはscanf
を使っていたけれど、これを使うにはstdio.h
を#include
しなければならなかったでしょう?
C++では、文字列を出力するときは
cout
、 文字列を入力するときはcin
を使い、これらを使うときはiostream
を#include
しなければならないのです。
- C++で入出力関数を使うときは
iostream
を#include
する
coutについて
#include <iostream> int main() { std::cout << "Hello World!\n" << std::endl; return 0; }
cout
を使います。
cout
はcharactor outputの略です。 具体的にcout
の後に<<
(左シフト演算子)を書き、その後に表示したい文字列を出力できます。 本来なら<<
は左シフト演算子ですが、
またはインサータなどと呼ばれています。
#include <iostream> int main() { std::cout << "Hello" << " " << "World!" << std::endl; return 0; }
複数の文字列を表示したいときも、このように<<演算子を繋げて、書くことができます。
#include <iostream> int main() { std::cout << "Melody in the sky" << std::endl << std::endl << "Raindrops have been falling down from gray colored" << std::endl << "sky and now they ran into my heart" << std::endl << "This high wall painted black is cutting off all my view" << std::endl << "and even blocking sunlight from me" << std::endl << std::endl; return 0; }
長い文章を表示するときは、このように複数行に分けて書く手法もあります。
(スマホで見ている方は横にして見ると読みやすいと思います。)
endl
はなに?
endl
を使うと、改行になるのよ。
だから、C++で改行を出力したいときは、
endl
を使います。
endl
のように関数に挿入したり、関数から抽出
したりする値で特別な効果を持つもののことを
マニピュレータといいます。
- C++で文字列を出力するときは
cout
を使う - C++で改行を出力するときは
endl
を使う - 出力するときに使う演算子を出力演算子という
- マニピュレータとは、関数に挿入したり、関数から抽出したりする値で特別な効果を持つもののことである
名前空間について
std::cout
とかstd::endl
のstd::
っていうのは何?
プログラミングでも、もし自分で
cout
関数を作ったとしたら、 std
のcout
関数と名前がダブってしまうでしょう?
2つ以上の関数名や、変数名が重なっていること
を「衝突する」と表現します。
ここでは「名前空間によって、同じ関数名が
あっても衝突を防ぐ」という話をしています。
std
のcout
っていう意味で、std::cout
って書いてんだ。
#include <iostream> int main() { std::cout << "Hello World!" << std::endl; std::cout << "Hello World!" << std::endl; std::cout << "Hello World!" << std::endl; std::cout << "Hello World!" << std::endl; std::cout << "Hello World!" << std::endl; return 0; }
std
って書くの大変じゃない?
だいたい間違っても独自のcout関数なんて宣言しないし。
衝突しないように気をつければいいんじゃない?
そういうときは、
using namespace 名前空間
とすることで、その名前空間を省略して使うことができるようになります。
#include <iostream> using namespace std; int main() { cout << "Hello World!" << endl; cout << "Hello World!" << endl; cout << "Hello World!" << endl; cout << "Hello World!" << endl; cout << "Hello World!" << endl; return 0; }
string型について
string型の基本的な使い方
#include <iostream> #include <string> using namespace std; int main() { string hello = "Hello"; cout << hello << endl; }
その前に、string
型の基本的な使い方を見ましょう。
上記のプログラムはstring hello
で宣言と同時に"Hello"
を代入し、cout
で表示するプログラムです。
実行結果はこの通り。
なお、string
型を使うにはstring
を#include
する必要があります。
実行結果
Hello
連結できる
#include <iostream> #include <string> using namespace std; int main() { string hello = "Hello"; string world = "World"; string hello_world = hello + " " + world + "!"; cout << hello_world << endl; }
こんなふうに足し算で文字列を連結できます。
実行結果
Hello World!
string型をconst char*型に変換したいとき
そんなときはconst char* chars = str.c_str();
でconst char*
型に変換できます。
char*型をstring型に変換したいとき
逆はもっと簡単。
string str = std::string(chars);
とキャストすればstring
型に変換できます。
- C++には
string
型(文字列型)がある string
型を使うにはstring
を#include
する必要がある- 足し算で文字列を連結できる
const char* chars = str.c_str();
でconst char*
型に変換できるstring str = std::string(chars);
でstring
型に変換できる
cinについて
cin
について話してないね!
cin
はC言語のscanf
と同じ役割を果たします。
#include <iostream> #include <string> using namespace std; int main() { string str = ""; cin >> str; cout << str; }
cout
と演算子の向きが逆なので気をつけましょう。
- 入力関数は
cin
を使う
最後に
これでCとC++の違いの説明は終わりです。
お疲れ様でした。