はじめてのC++ 【49日目】

# はじめに
この一週間はHTML/CSSに時間を費やした。C++と両立できるかと思ったが無理だった。HTML/CSSのqiitaを書こうかなと考えたが記事を書くよりてっとりばやく終わらして、C++再開しようと思った。とりあえず、HTML/CSSのデモページを作って雰囲気は掴めたので、これからWebサイトは趣味程度にコツコツ作っていくつもり。そして、Webサイトを実際に作りながらjavascriptを平行してやろうかなと思う。
そして次は、Webアプリケーションに必要なバックエンド側に取り掛かろうと思う。いろいろ話を聞いたり調べて観た結果、 `Golang` をすることに決めた。 `Go` は `C++` に似ていると聞いたので楽しみ。明日から取り掛かろうと思う。

## １週間の成果
![Screenshot from 2019-06-18 22-55-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298612/36fd8e92-9a86-fe8e-b5c3-0fd4f19c6fed.png)

教本を見ながら作ってみた。著作権フリーとのことで掲載するのは問題ない。
`HTML/CSS` は思ったより簡単で感覚的にコーディングができた。 （`C++` に毒されているせいなのか？）
Webページの制作は、コーディングより設計の方が大変だなと感じた。

## C++
学校の方で、 `linkedIn` のオンライン教材が配られた。そこに、 `C++` の講座があったので今日はそれをやってみる。
### ラムダ式
前々から、ラムダ式は気になっていた。 `std::sort` を使いたいときに、ラムダ式がよくわからないから避けていた(笑)。今回の目標は、ラムダ式で自由に `sort`　できるようにすること！

**ラムダ式とはなにか**

>ラムダ式とは、簡易的な関数オブジェクトをその場で定義するための機能である。

>標準C++のアルゴリズムライブラリには、関数を引数とするものが多くある。それらは各問題を解くために非常に有用ではあったが、アルゴリズムを使用するたびに関数オブジェクトを定義することは非常に冗長で使いにくかった。アルゴリズムをより使いやすくするための言語サポートとして、ラムダ式が導入されることとなった。

[C++日本語リファレンス](https://cpprefjp.github.io/lang/cpp11/lambda_expressions.html)

`std::sort` のソート方法を増やすためにあると思っていたが違うみたい。

**とりあえず書いてみる**

```cpp:1.cpp
#include <iostream>

int main()
{
  [](int x)//int x　は 引数
  {
    std::cout << x << std::endl;
  }(100);//関数呼び出し
}
```
```:実行結果
100
```
ラムダ式は `[]` で書き始めて `(int x)`　が関数の引数型宣言、 `{}` の中に関数の中身を書いていく。ラムダ式は関数オブジェクトにより、関数呼び出し演算子 `(100)` を使用して関数を呼び出している。

**ラムダ式をそのまま代入できる!?**
ラムダ式は `auto` を使うことで適当な変数に代入することができる。

```2.cpp
#include <iostream>

int main()
{
  auto a = [](int x)//int x　は 引数
  {
    std::cout << x << std::endl;
  };

  a(500);

  std::cout << "a　の中身は" << a << std::endl;//実験
}
```
```:実行結果
500
1
```
aにラムダ式を代入して `a(500)` と入力すれば `500` と出力された。好奇心で、 `a` の中身を `std::cout` で出力してみたらどうなるのか調べてみると、 `1` が出力された...。アドレスかなんかが表示されるのかと思いきや全く謎の数字。よくわからん。

**ラムダ式の返り値は指定できる！**
ラムダ式の返り値は `return` の値から予測してくれるのだが、指定したければ指定できる。

```3.cpp
#include <iostream>

int main()
{
  auto a = [](int x) -> int//ここで返り値の型指定！
  {
    return x * 4.3; //浮動少数点でかけている
  };

  std::cout << "a(500)は" << a(500) << std::endl;
}
```
```:実行結果
a(500)は2150
```
ちゃんと `int型` になっている事がわかります。

**ラムダ式は外のローカル変数が使える！**
基本的に関数は引数を通してでないと外のローカル変数は使えない。しかし、ラムダ式では、キャプチャという機能を使うことで外のローカル変数を使うことができる。
キャプチャの方法は `[]` の中にオプションをつける。
1. `[=]　コピーキャプチャ` ローカル変数をコピーして使う方法。つまり `コピー渡し`　みたいな感じ。しかし、コピー先が `read_only` のため、 `y`　の値は直接変えることができない。例（`y = y - 5;`）
2. `[&] 参照キャプチャ` 参照渡しで使う方法。これは、 `y = y - 5;` ができる。もとの値にも影響がある。
3. `[y, &z] 明示的に分ける`
4 `[f = y + z ] 新しい変数を定義`

```4.cpp
#include <iostream>

int main()
{
  int y = 5;
  int z = 10;
  auto a = [=](int x) -> int//ここで返り値の型指定！
  {
    //y -= 5;
    return x + y + z;
  };
  std::cout << "a(500)は" << a(500) << std::endl;
  std::cout << "yの値は" << y << std::endl;

  auto b = [&](int x) -> int//ここで返り値の型指定！
  {
    y -= 5;
    return x + y + z;
  };
  std::cout << "b(500)は" << b(500) << std::endl;
  std::cout << "yの値は" << y << std::endl;

}

``` 
```:実行結果
a(500)は515
yの値は5
b(500)は510
yの値は0
```
**ラムダ式は引数もautoにすべき！**
引数を `auto` にして返り値の指定をしなければ `template` みたいに使えるという。
また、クラス内では `this` ポインタを使うことでクラスのメンバにもアクセスできる。

**まとめ**
ソート使うとき以外の使いみちは、まだみたことないけどソートのときくらいは使おうと思う。
# 終わりに
linkedinわかりやすいね。スマートポインタの動画もあったから明日はそれやってみる。
残念ながら `Go` はlinkedinにはなかった。
おやすみんさい。