C#の基本的な文法を覚えてからC++を始めた際にとまどう部分についてのメモです。
■Hallow Worldでまず戸惑う
初心者が入門ページを検索してまずお目にかかる「std::cout << "hoge" << std::endl;」という謎の記述法に戸惑う。
ラムダ式を初めて見た時のような感じ。
■printfで戸惑う
「printf("%f\n", 123.456);」こういう「%c」とか「%d」の指定で戸惑う。
C言語の文法みたいですが、この時点でもう「ややこしいっ」という印象を持ってしまう。
■include と namespace の違いが分からない
C#は先頭にusingを記述してクラス参照時に名前空間を省略可能になりますが、それとincludeとの違いが分からず戸惑う。
■クラスがヘッダーと本体と分かれている
includeでヘッダーだけ読むというパターンに多く遭遇して、そもそもクラスがヘッダーと中身の定義でcppファイルが分かれていることに戸惑う。
■関数が使用される行よりも先に宣言が必要
関数が実際に呼ばれる行よりも前に宣言しておかないといけないのと、そのためか宣言だけ行って中身の定義は後にしてと分割していることに戸惑う。
■define
コンパイルされる直前にテキスト置換されるということで「あ、なるほど便利そう」というのは何となく分かるのですが、慣れてないのでコードを読む際にそもそも混乱するし、さらに ifdef が出てくると余計に頭が混乱する。
■ポインターの存在理由
ポインターが初心者の壁みたいな話は過去に何度も聞いたことがあったので存在だけは知っていたものの、アドレスを指定すると便利な場面というのが思い浮かばなくて理解が難しい。
例えばC#でも変数の値をコピーではなく参照渡ししたい場合はあって、その際にポインターが利用できるということだけなら分かるのですが、何か宣言した際にメモリをどれだけ使用しているかを把握している前提でその中身をアドレス指定で操作したり値の入っているアドレスをスライドしたりといったことがどんな用途で役に立つのかが、ちょっとしたツールを個人で作った経験上では思い浮かばない。
もちろんゲーム開発で厳密なメモリ管理をしてロードを1ミシ秒でも速くしないといけないのは分かるけど、個人がちょっとしたゲームやツール作る上では必要ないんじゃないかと学習をすっ飛ばしたくなる。でもちゃんと理解しないとチュートリアルを見て「何をやってるのか」が理解できなくなるので学習は必要なんだろうなと。
■C++のバージョンの違い
11とか14とか17とかあって、初心者でもこれらの差で知っておいた方が良いことがあるのか気にしなくて良いのかどっちなんだと戸惑う。
随時追加していく予定。