LoginSignup
5
0

More than 3 years have passed since last update.

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

Posted at

はじめに

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

1週間の成果

Screenshot from 2019-06-18 22-55-53.png

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

C++

学校の方で、 linkedIn のオンライン教材が配られた。そこに、 C++ の講座があったので今日はそれをやってみる。

ラムダ式

前々から、ラムダ式は気になっていた。 std::sort を使いたいときに、ラムダ式がよくわからないから避けていた(笑)。今回の目標は、ラムダ式で自由に sort できるようにすること!

ラムダ式とはなにか

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

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

C++日本語リファレンス

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

とりあえず書いてみる

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にはなかった。
おやすみんさい。

5
0
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0