bookmark /
IT /
言語 /
C /
(V)C++
テンプレート
- C++ テンプレート
- テンプレート
- テンプレート( Template )「原型」
C++ 言語で使用できる、関数やクラスを使う時に、中で使う特定の「型」を決められる
システム。
- たとえば「大きい値と小さい値を入れ換える関数」を作りたいと考えたとする。引数には、
int どうしだけでなく double や CString でも使いたいと考え、でも同じ型どうしの入れ替
えのみできるようにしたいと考えた。
- これまでは、地道にすべての型の関数を作るか、マクロを使うしかなかったが、前者は面倒
であり、後者は型チェックが行われない。
そこで使用されるのがテンプレートである。テンプレートをこの関数の引数に用いることで、
すべての型をこの関数に渡すことができるようになる。
- 注意して欲しいのが、これは決してプログラムの実行時に行われるわけではないということ
だ。コンパイル時に、テンプレートを、指定された型に置き換えるだけである。だから、型チェ
ックはコンパイル時に行われ、また<や>等の比較演算子を持たない型はちゃんとチェックでき
る。
- つまり、テンプレートとは、安全性が高くそして幅広い使い方のできる、マクロの進化形だと
いうことである。事実、これまでマクロに頼っていた部分がどんどんテンプレートに置き換えら
れつつある。
テンプレートの使用方法は、大きく分けて関数テンプレートとクラステンプレートとがある。
レクチャー
- typedef,union,enum
- WorkSpace C++ -- const , const char* , char* const , constと参照 , enum , "C"リンケージ ,メモリ領域の動的確保 ,クラスで共通な処理 ,継承 ,メンバ関数の継承 ,クラスデータメンバの初期化 ,静的データメンバ ,静的データ関数
- クラスとインスタンスの記述
- プログラム学習室 C++言語 基本のき --ファイルI/O等
- Computer Planet
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;
- マクロ
- #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)
- 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
*メニュー
最新の20件
2018-04-17
2012-01-07
2011-12-07
2011-11-03
2011-10-20
2011-10-18
2014-07-13
2013-08-10
2012-01-26
2012-01-25
2012-01-24
2012-01-23
2012-01-21
2012-01-20
2012-01-19
2012-01-17
2012-01-14
2012-01-13
2012-01-09
人気の10件
- counter: 1774
- today: 1
- yesterday: 0
- online: 2