C++言語の基礎　第2弾：名前空間

# #C++言語の基礎< 名前空間 >

##はじめに
C++言語の基礎を簡単にまとめていくことで理解を深めていくことが目的である．その第2弾として，「名前空間」を扱う．

##環境
#####コンピュータ
|||
|:-:|:--|
|デバイス|MSI|
|プロセッサ|Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz|
|実装RAM|8.00 GB (7.89 GB 使用可能)|
|OS|Windows (Windows 10 Home, バージョン：20H2)|

####C++
|||
|:-:|:--|
|Editor|Visual Studio Code|
|Compiler|Minimalist GNU for Windows|


##Hello World
####ヘッダとiostream
* \#includeでヘッダファイルを読み込むが，C言語と区別するためにヘッダと呼ばれ，**.hの拡張子は不要**
* ヘッダの読み込みにより**クラスが使える**ようになる．（C言語では関数だった）

##名前空間
C言語にはなかった概念
####cout
* C言語の``printf()``と同じような働きを持つが，関数ではなくオブジェクトで入出力の出力部をつかさどる

* C++言語の入出力ストリームでは$>>$および$<<$を用いることにより、ストリームと呼ばれる対象に対するパラメータのやりとりを行う

##標準名前空間
####名前空間とは
大規模開発において何かを定義する際，名前の重複問題となる．
→ これの解決策として名前空間という概念が作られた．名前空間が違えばその中で重複がない限り許される．

####名前空間の利用
名前空間には標準名前空間と呼ばれるもともとC++言語に備わっているものとユーザが定義するものがある．stdは標準名前空間であり，coutやendlなどはこの中のメソッドである．使うとき，``名前空間::（変数名やクラス名）``と記述するが，次の操作を行うことで名前空間の記述を簡略化できる．

```
  　　using namespace （名前空間）; をmain関数の前で記述する
```
後に示す実装の中で具体的な部分を確認できる．

##コンソールからの入力
####cin
* C言語の``scanf()``と同じような働きを持つが，関数ではなくオブジェクトで入出力の入力部をつかさどる

* cin $>>$（変数）記述により変数に入力できる．なお，後ろに続けて$>>$（変数）を付け加えていくことで半角スペース区切りで一度に複数個の力を可能とする．1つ1つの変数をEnterキーで入力していく場合その数だけ，cinを記述する．

##stringと文字列
####cin
C++言語では、文字操作を行うstringというクラスが存在する．これをcinおよびcoutと合わせて使うと大変便利．演算子を用いて文字への操作が可能となる．

####stringで用いられる主な演算子
|||
|:-:|:--|
|演算子|意味|
|+|文字列同士の足し算|
|+=|文字列同士の足し算（代入演算）|
|==|比較演算（内容が同等）|
|!=|比較演算（内容が異なる）|
|>|比較演算（文字列の大きさ）|
|<|比較演算（文字列の大きさ）|

##実装
上記の説明を簡単な例で実装する．以下にソースコードとそのときの出力をそれぞれ示す．

#####ソースコード：Hello World
```c++:code_001.cpp
/*
  2021/04/23
  @Yuya Shimizu

  Hello World
*/

#include<iostream>
using namespace std;

int main(){
  cout << "Hello World" << endl;
  cout << "こんちには" << endl;

  return 0;
}
```
#####出力
```
Hello World
こんちには 
```
coutにより，文字が出力されている．``using namespace std;``の記述により，``std::cout``を``cout``と記述することできていることに注意．

#####ソースコード：名前空間
```c++:code_002.cpp
/*
  2021/04/23
  @Yuya Shimizu

  名前空間
*/

#include<iostream>
//using namespace std;

int main(){
  std::cout << "Hello World" << std::endl;
  std::cout << "こんちには" << std::endl;

  return 0;
}
```
code_001.cppでの記述とほぼ同じだが，``using namespace``の記述がない．これにより，``std::cout``というようにクラスを名前空間と共に記述する必要が出てきている．
#####出力
```
Hello World
こんちには
```

#####ソースコード：入力
```c++:code_003.cpp
/*
  2021/04/23
  @Yuya Shimizu

  入力
*/

#include<iostream>
using namespace std;

int main(){
  int a;

  cin >> a;
  cout << "a = " << a << endl;
  
  return 0;
}
```
#####出力
```:25を入力した場合
25
a = 25
```
cinにより入力ができるようになっていることが確認できた．cinについてもcout同様，``using namespace std;``のおかげで，``std::cin``と記述しなくて済んでいる．
#####ソースコード：stringと文字列
```c++:code_004.cpp
/*
  2021/04/23
  @Yuya Shimizu

  stringと文字列
*/

#include<iostream>
#include<string>
using namespace std;

int main(){
  string s, t;

  t = "入力された文字は,　";

  cout << "文字列を入力：";
  cin >> s;
  cout << t + s << "です．" << endl;
  
  return 0;
}
```
#####出力
```:testという文字を入力した場合
文字列を入力：test
入力された文字は,　testです．
```
確かに入力した文字を用意していた文字列と結合させられていることが確認できる．ただし，今の結果を得るだけであれば，わざわざ結合しなくとも，coutにより，<<で足していくこともできる．

##感想
C++言語はC言語の拡張でC言語とあまり変わらないだろうと思っていたが，いざ勉強して見ると少し雰囲気が違うと感じられる．これを機に気を引き締めて学習を進めていきたい．

##参考文献
1週間で身につくC++言語の基本　　　　　　　シフトシステム株式会社
( https://cpp-lang.sevendays-study.com/index.html ) 2021/04/25