bookmark / IT / 言語 / C / (V)C++


bookmark / IT / 言語 / C / (V)C++

テンプレート

  • C++ テンプレート
  • テンプレート
    • テンプレート( Template )「原型」 C++ 言語で使用できる、関数やクラスを使う時に、中で使う特定の「型」を決められる システム。
    • たとえば「大きい値と小さい値を入れ換える関数」を作りたいと考えたとする。引数には、 int どうしだけでなく double や CString でも使いたいと考え、でも同じ型どうしの入れ替 えのみできるようにしたいと考えた。
    • これまでは、地道にすべての型の関数を作るか、マクロを使うしかなかったが、前者は面倒 であり、後者は型チェックが行われない。 そこで使用されるのがテンプレートである。テンプレートをこの関数の引数に用いることで、 すべての型をこの関数に渡すことができるようになる。
    • 注意して欲しいのが、これは決してプログラムの実行時に行われるわけではないということ だ。コンパイル時に、テンプレートを、指定された型に置き換えるだけである。だから、型チェ ックはコンパイル時に行われ、また<や>等の比較演算子を持たない型はちゃんとチェックでき る。
    • つまり、テンプレートとは、安全性が高くそして幅広い使い方のできる、マクロの進化形だと いうことである。事実、これまでマクロに頼っていた部分がどんどんテンプレートに置き換えら れつつある。 テンプレートの使用方法は、大きく分けて関数テンプレートとクラステンプレートとがある。

レクチャー

EXCEL連携

ライブラリ

  • スマートポインタークラス
    • C++にはガーベジコレクタのような機構が言語的には存在しないため、 new したものは必ず自分で delete しないと、メモリリーク・リソースリークの原因となってしまいます。
  • しかし、 全ての new に対して確実に delete 出来るように見張って注意深くコードを書く、 というのはなかなか面倒ですし、 人力でやるのはバグを呼びやすいところです。
    • そこで、使わなくなったら自動で delete されるポインタ、 があると便利なわけです。
    • C++標準ライブラリにもこの目的で auto_ptr というテンプレートが実装されていますが、こいつは同時には一カ所からしか利用しないことが前提だったり、 vector<T> 等のコンテナに入れられなかったりと、 すこーし使い勝手に不満が残ります。

関数


ポインタとconst

区分指す対象指しているデータそのもの備考
非定数データへの非定数ポインタ変更可変更可void convertToUpperCase?(char* sPtr)
定数データへの非定数ポインタ変更可変更不可void printCharacters(const char* sPtr)読み出し専用ポインタ
非定数データへの定数ポインタ変更不可変更可int* const ptr = &x;ptrは整数への定数ポインタ。
整数はptrを通して変更可だが、ptrは常に同じメモリ位置を指す
配列はこれがデフォルト
定数データへの定数ポインタ変更可変更不可const int* const ptr = &x;ptrは常に同じメモリ位置を指し、そこにある整数も変更できない

メモ

  • 継承
    • public継承 (通常使う)
      • 親のpublicメンバ ⇒ 子のpublicメンバ
      • 親のprotectedメンバ ⇒ 子のprotectedメンバ
      • 親のprivateメンバ ⇒ 子のprivateメンバ
  • protected継承
    • 親のpublicメンバ ⇒ 子のprotectedメンバ
    • 親のprotectedメンバ ⇒ 子のprotectedメンバ
    • 親のprivateメンバ ⇒ 子のprivateメンバ
  • private継承(デフォルト)
    • 親のpublicメンバ ⇒ 子のprivateメンバ
    • 親のprotectedメンバ ⇒ 子のprivateメンバ
    • 親のprivateメンバ ⇒ 子のprivateメンバ

public継承の場合、派生クラスは、基本クラスのpublic、protected と宣言されたデータメンバとメンバ関数を引き継ぎますが、親の privateメンバにはアクセスできません。基本クラスのメンバ関数を派生クラスで定義し直すことも可能です。ただし、再定義によって引数の型や戻り型、関数名の変更は許されません。型や名前が変われば、それは新しいメンバ関数と見なされます。

  • インライン
    • 関数呼び出しによるオーバーヘッドを少なくするために、インライン関数が用意されている 関数定義でリターン値型の前に修飾子inlineをつけておくと、コンパイラはその関数が呼び出された場所にそれのコピーを埋め込む
  • ポインタとの違い ⇒ 下記を参照(特に6)
    • 参照の制約
    • 1、他の参照を参照不可
    • 2、参照のアドレスを取得不可能
    • 3、参照の配列を作成不可能
    • 4、ビットフィールドの参照不可能
    • 5、クラスメンバ、戻り値、関数仮引数の場合以外は初期化が必要
    • 6、参照先を変更不可能
  • デフォルト引数
    • 関数呼び出しでデフォルト引数が省略されたときは、その引数のデフォルト値が自動的に渡されます
    • 2つ以上のデフォルト引数を持つ関数の呼び出しで、引数を省略したいときは、引数リストの右側にある引数から省略しなければいけません
  • ポインタ(変数)
    • メモリアドレスを値として持つ変数
    • int *countPtr
    • 「countPtrはintへのポインタである」
    • 「countPtrは性姿オブジェクトを指す」
  • アドレス演算子
    • &は、オペランドのアドレスを返す単項演算子
    • int y=5;
    • int *yPtr;
    • yPtr = &y;
  • const
    • 262あたり
  • マクロ
    • #define AAA(p1,p2,p3) \ This is a Test by p1 \ This is a Test by p2 \ This is a Test by p3

AAA(hoge,hoge,hoge) AAA(foo,foo,foo)

  • ファンクタ
    • 関数オブジェクトのことらしい
    • functor
  • constメソッド
    • 引数も含めて副作用がないのかと思っていたが、クラス内部のメンバ変数に副作用がない、ということらしい
      • 引数は、引数を受け取るときにconstがついていればいいということだ
    • 基礎からC++Programing
      • クラス内で宣言されているメソッドは、無条件でプロパティにアクセスできる 権利を持っています。 これも時によっては、無用なアクセスを招きバグを誘発することがあります。
      • とくに巨大なクラスであればあるほど危険性が加速していくことは 分かるでしょう。
      • そこで、constをつけて予防しておけば危険性を減らすことができるのです。
      • 但し、例外的に変更したいようなプロパティもあります。 その場合、プロパティに「mutable」キーワードをつけて宣言してください。 constメソッドからも変更できるようになります。
  • constポインタについて
    • このConstMethod?のなかでは、thisはconstなので、メンバであるm_rcMyRect?もconstであり、&m_rcMyRect?の型は、const RECT*となります。すなわち、fooは、引数にRECT*ではなく、const RECT*を取らなければなりません。
  • typename
    • T::value_type *p; ポインタ p の宣言ではなくて、 T::value_type と p の乗算とみなされてしまう。 このような時には、プログラマがコンパイラに対して 「T::value_type は何かの型を表しているぞよ」 ということを教えてやる必要がある。そのためのキーワードが typename なのである。

C

  • 圧力比 pe/p0 の数値解をニュートン法で求める

home