初投稿になります。今回は、自己流のC++のコーディング規約です。
自分はアマチュアC++書きデス。
#C++の危ない話。
C++はC言語の流れを組む言語です。しかし、Cとは大分かけ離れた言語になりました。そこでC++はベターCもこなせるので初学者はC言語を先にやるよりC++を先にやったほうがいいのではないかと思っています。
C/C++の便利で危険な機能は絶対的にポインタ関連です。
これは、直接!機械のナイーブなところを触りに行くので、コンピュータの構造を物理的に簡単に破壊しうるというのが一つの要因です。
しかし、例えば、とあるハードウエアのAPIがついてきたりしたなどすれば、それはある種マネージされた構造であり、ポインタで直接そのハードウエアを叩き行くということは構造が壊れるのでで避けるべきです。
なので、ポインタの使用は自分はあまりしません。
基本的に、ライブラリがやってくれるからです。
#C++の安全な話。
C++の安全なところは本当にほかのスクリプトと同じように純粋計算領域はどの言語でも大体安全です。
要するに、整数と浮動小数ではプログラムを破壊する作用を発揮するのにそのように書いて、純粋構造を破壊しに行かなければなりません。
なので、一般的に数値計算をするだけなら割り算でゼロで割る以外の不具合には会いにくいです。
基本的な事はSTLで。ローカルで共有したければ、スマートポインタで。
#メモリとライブラリの話。
C++はハードに添えつけられたメモリにダイレクトに触りにいくことができます。
これがかなりもどかしく、変数の連なりである配列もメモリのブロックでしかないです。なので、いろんな人がメモリをnewしたがるのですが、基本的にはやめてください。じゃあ配列は使えないかというと、いや違います。newをしたら、しっかりdeleteするのが作法なのですがそれらについては、先人が便利な構造を持った配列にも使える機構を標準ライブラリとして用意してあるのです。
・vectorは必ず1本のメモリブロックの配列になるようになっています。追記は尻尾に追記しか基本的にはしてくれません。
・dequeueはvectorに近いですが、前方にも挿入が可能です。
・setは集合などといいますけど、構造としてはツリー構造だったと思います。
・mapはsetのに近い構造ですが、検索に使う要素と実用される要素が分離しています。2値運用します。
・listは挿入と削除が早い構造ですが、各要素に対するアクセシビリティはあまり良くないです。
先人の知恵によってこのような構造はすでにあるのです。なのでそれをありがたく利用して自分のタスクをこなすのです。
ちなみに標準ライブラリ内ではnewやdeleteは利用されていますが、ライブラリを作るのであればnewやdeleteを使わざるを得ない状況はママあります。
アルゴリズムとデータ構造はプログラミングの基礎の基礎なのでかじっておきましょう。
#C++の文字列の話。
文字列は配列です。単純に。Nバイトのブロックを基準とした配列です。Nは1の時もあります。
これは変数一つで一つのモノしか原則表せないのでその変数一つに一文字を当てて配列にしたものが文字の列です。
なので、100という数字を文字列で表すときは、整数であれば1バイトで済みますが、文字列であれば最低3バイト使います。
それで文字列もまた整数の羅列であるので、超長規模の文字列を検索するのは遅いです。何か構造を考えなければ終わりません。
ほとんどのC++の環境ではAsciiコードというモノを採用しています。詳細はググってください。
#C++のエラーの話。
筆者が良く出会うエラーの代表的なものは、ゼロで数字を割ったときに出るものかstd::auto_of_range()の例外を投げられた時です。ほかのエラーは、基本的にアルゴリズムが間違ってるロジックエラーです。
はっきり言って例外は遅いです。
C++のクラスにはコンストラクタとデストラクタがあるのでそれさえキッチリ書いてあればおかしなことにはなりにくいですが、例外は大域ジャンプなのでプログラムの流れをぶっ壊します。
あと、まじめにすべての例外を処理するためのコストを渋って握りつぶす人の話を聞いたことがあります。
なので、筆者はエラーの返却には関数の戻り値を使っています。
基本的に戻り値は3種類に分けられます。成功、失敗、どうでもいい。です。
どうでもいい。は成功とは言いたくないけど明確にエラーでは無いということを通知します。極まれにそういうことがあります。
これを表現するのにtriboolという概念はなくないのですが、コンピュータとしては3値は半端すぎます。「悔しすぎる。」
なのでちょっと譲って、成功と失敗程度のモノしか扱えない、bool型の変数を使います。まぁ、これもほとんどの実装が速度のために1ビットでは無いのだけど。
正直言うと、アルゴリズムのエラーではプログラムは仮初に動いてしまうので、エラーで落ちたら感謝しましょう。
そして、エラーを潰しながら妥当性を喪失しないようにデバッグを完了させてください。
#CとC++の違いの話。
CとC++はC++がCをフォークしたときに道を分かちました。
C++がCの最新機能を使うには、標準委員会という機構が話し合っていれるので少しディレイがあります。
Cはシンプルです。整数と浮動小数と配列とポインタと構造体等といったら大体機能が網羅できる程度に小さいです。
そして、標準ライブラリも基本的にシンプルなので大きなものを作るにはどうしてもオレオレ実装をしなければならないです。
C++はCにはないクラスという機構によって大幅な拡張の余地を得ました。
CとC++の違いは基本的にはクラス機構があるか無いか程度ですがそれが一つのパラダイムシフトだったのです。
#C++とJavascriptの違い。
C++とJavascriptの違いは、用途方面が違うのを除いて、型システムが明示されているか暗示されているかという違い程度しかないです。
しかし、Javascriptは型システムが暗示されている程度なのでデバッグするのが筆者は大嫌いです。
Javascriptは言語仕様がシンプルでまとまっていて多様性に富みます。まるでlispの様です。
筆者の雑念ですが、Javascriptは型システムが明になったときにコンパイラを書く人が出てくるのではないかと思います。
#C++への願望。
筆者は一つ過去に消えた機能で入ってほしかった機能があります。それがUnifyed call syntaxです。
詳細は省きますが、「これがあったらコンパイルタイムのマクロオペレーションかけたのにチキショー」って感じです。
未練たらたらですよ。マジで。
#総括の話。
今回は以上です。
基本的にプログラミングというのは書いた通りに動くものです。その中には欺瞞も嘘もありません。
あと、雑記になってしまったので読む人がいるかはわかりませんけど。
「ここまで読んでいただきありがとうございました。」
ということにしておきます。
この記事が肥やしになりますように。良かれ悪かれ。