Monthly Archives

Home >2006年06月

2006-06

スポンサーサイト
...
----- | スポンサー広告
メタ関数
昨日予告したように、今回からテンプレート・メタプログラミングに関する話題を取り上げていきたいと思います。C++のテンプレートは、元々は型 T のコンテナを実装する程度の用途しか想定されていなかったのでしょうが、STLやBoost C++ Librariesなどを見ても分かるように、非常に広い用途に利用されています。今回は、テンプレート・メタプログラミングの最も基礎にあたる「メタ関数」を取り上げてみたいと思います。(メタではな......
06-30 | テンプレート・メタプログラミング | Comment : 3  | Trackback : 0 
今後の予定
これまで、1ヶ月半あまりにわたって、「CからC++へ」ということで記事を書いてきましたが、そろそろ飽きてきました。今後も、一応一通りのことを書き終えるまでは続けるつもりですが、並行して別の話題も進めていきたいと思います。で、別の話題なのですが、「テンプレート・メタプログラミング」について書いていこうと思います。「CからC++へ」の読者層とは完全に異なるような気もしますが、まあ気にせず進めることにします。テ......
06-29 | 未分類 | Comment : 0  | Trackback : 0 
explicit指定子
前回取り上げた変換コンストラクタは、便利な反面、(変換コンストラクタにする意図はなく)単に引数を1つ受け取るコンストラクタを定義しただけで、変換コンストラクタになってしまい、意図しないところで暗黙の型変換が発生する危険性をはらんでいます。現実には、変換コンストラクタが本当に必要になることは少なく、ほとんどの場合は、引数の数がたまたま1個であるコンストラクタの場合が多いのです。そうした場合、そのまま放......
06-29 | CからC++へ | Comment : 0  | Trackback : 0 
変換コンストラクタと変換関数
話題が前後しますが、今回はコンストラクタの一種である変換コンストラクタと、クラス型から他の型への暗黙の型変換を実現するための変換関数についてお話します。まずは変換コンストラクタからです。変換コンストラクタは、コンストラクタの一種ですので、オブジェクトの初期化の際に呼び出されるものですが、これは他の型からそのクラス型への暗黙の型変換を可能にするものでもあります。変換コンストラクタは、引数を1つだけ受......
06-29 | CからC++へ | Comment : 0  | Trackback : 0 
純粋仮想関数
前回は仮想関数のお話でしたが、今回は仮想関数の一種である「純粋仮想関数」についてです。前回取り上げたshapeクラスを例にとって、純粋仮想関数について簡単に書いてみることにします。shapeクラスは、図形を表現するための基底クラスですので、その具体的な形状が決まっていません。具体的な形状は派生クラスで、cireleクラスであれば円、rectangleクラスであれば長方形を表すことになります。具体的な形状が決まらないと、図......
06-29 | CからC++へ | Comment : 0  | Trackback : 0 
仮想関数
クラスを継承することで、派生クラスは基底クラスの性質を継承することができますが、特定のメンバ関数の振る舞いを、実際のクラス型に応じて変更したいことはよくあります。例えば、よくある例としては、shapeクラスから派生した、circleクラスとrectangleクラスでは、描画に使用するdrawメンバ関数の振る舞いを変更したいはずです。メンバ関数の振る舞いを変更できなければ、データとして式を持たせたり、別途用意した描画用の関......
06-28 | CからC++へ | Comment : 0  | Trackback : 0 
基底クラスとデータメンバの初期化
基底クラスにせよ、データメンバにせよ、それらが引数を受け取るコンストラクタを持っているのであれば、何らかの方法でコンストラクタに実引数を渡し、オブジェクトの初期化を行う必要があります。ますは、次の例をご覧ください。struct A{  A(int arg);};struct B{  B(int arg1, int arg2);};struct C : A{  B b;  C();};あまり具体性のない、とってつけたようなサンプルです。ここでは、基底クラスAを継承......
06-19 | CからC++へ | Comment : 0  | Trackback : 0 
基底クラスのアクセス制御
前回はクラスの継承を構造体を使って説明しました。話を単純にするために、やや誤解を招く恐れのある書き方をしてしまったので、早めにフォローしておくことにします。今回は、その誤解を招く恐れのある部分に関連した、基底クラスへのアクセス制御です。前回は、「このようにクラスを継承するときには、structやclassといったクラスキーとクラス名の後に、継承しようとするクラス名をコロン : で区切って記述します。」と書きまし......
06-18 | CからC++へ | Comment : 0  | Trackback : 0 
クラスの継承
今回はクラスの継承についてです。結構複雑な内容になるので、今回は概略だけにとどめ、何度かに分けてお話していければと思います。継承というのは、他のクラスの持つ性質を受け継いだ別のクラスを定義することを意味しています。具体的な使用例は後回しにして、まずは構文から見ていくことにします。struct A{  int a;  int foo(int arg);};struct B : A{  int b;  void bar();};上の例では、クラスAを継承......
06-18 | CからC++へ | Comment : 0  | Trackback : 0 
演算子の多重定義
演算子の多重定義(オーバーロード)は、C++ならではの機能のひとつです。一時期は、とある方面から迫害を受けた機能ですが、現在ではその有用性が見直され、なくてはならない機能になっています。なお、最近ではC#でも演算子の多重定義ができるということもあり、C++の専売特許ではなくなりました。演算子の多重定義の具体的な使い方ですが、ストリームに対する入出力のためにシフト演算子を多重定義しているのが代表例のように言......
06-18 | CからC++へ | Comment : 0  | Trackback : 0 
インライン関数
最近では、インライン関数をサポートするC処理系も増えてきたので、インライン関数がどういうものかご存知の方も多いことと思います。インライン関数は元々C++からCにバックポートされたものですので、当然C++にもあります。インライン関数を使うには、関数宣言にキーワード inline を付けることで行います。この inline はinline指定子と呼ばれます。以下に例を挙げます。inline void foo(int arg){  return arg + 123;}int ......
06-15 | CからC++へ | Comment : 0  | Trackback : 0 
静的データメンバ
メンバ関数に静的メンバ関数があるように、データメンバにも静的データメンバというものがあります。静的データメンバは、クラス型のオブジェクトが保持するメンバではなく、静的記憶域期間を持つ非局所オブジェクトです。静的メンバ関数と同様、静的データメンバもキーワード static を付けることで宣言しますが、やはりstaticが付くからといって内部結合になるわけではありません。ある意味で、その振る舞いは大域的オブジェクト......
06-14 | CからC++へ | Comment : 0  | Trackback : 0 
静的メンバ関数
クラスのメンバ関数には、暗黙的に this を受け取る通常のメンバ関数の他に、this を受け取らない「静的メンバ関数」というのがあります。this を受け取らないということは、特定のオブジェクトを指定する必要がないことを意味しています。つまり、静的メンバ関数は、特定のオブジェクトを操作するのではなく、クラスそのものを操作するものであるといえます。静的メンバ関数を定義するには、キーワード static を付けます。static......
06-13 | CからC++へ | Comment : 0  | Trackback : 0 
constオブジェクト
const修飾子はCにもありますが、これは元々C++から生まれたもので、標準Cが成立する仮定で、Cにも取り入れられました。ところが、なぜか中途半端な形で取り入れられ、CとC++の非互換性の一つにもなっています。Cでは、const修飾があろうとなかろうと、関数の外で定義されたオブジェクトは、デフォルトでは外部結合でした。しかし、C++では、名前空間有効範囲で宣言されたconst修飾付きのオブジェクトは、明示的にexternを付けない......
06-13 | CからC++へ | Comment : 0  | Trackback : 0 
名前空間
Cでは、プログラムがある程度以上の規模になってくると、外部識別子の衝突を防ぐために、モジュールごとに何らかの接頭辞を付けるなどの工夫が必要でした。しかし、その結果として、どうしても識別子が長く汚くなるという弊害があったと思います。C++では、そのような問題を解消するために、「名前空間」という機能が設けられています。実はCの仕様にも名前空間というものがあったのですが、これは全く別の概念で、タグ名やラベル......
06-13 | CからC++へ | Comment : 0  | Trackback : 0 
例外処理機構
比較的モダンなプログラミング言語の多くには、例外処理機構が備わっています。C++にも、やはり例外処理機構があります。このブログを始めた当初、例外処理に関する記事をいろいろと書きましたが、私は、C++とCの決定的な違いは例外処理機構の有無にあるのではないかとさえ考えています。もちろん、何を以って「決定的な違い」とするのかにもよります。しかし、例外処理機構ほど、プログラミング・スタイルに大きな影響を与えるも......
06-12 | CからC++へ | Comment : 0  | Trackback : 0 
new演算子とdelete演算子
C++で新しく導入された演算子に、new演算子とdelete演算子があります。これらは、オブジェクトを動的に生成・解体するための演算子です。よくある誤解に、new演算子とdelete演算子はmalloc関数とfree関数の置き換えであるというのがあります。確かに、new演算子とdelete演算子は、malloc関数とfree関数を使って実装されていることが多いですし、それらと同等の働きをすることもあります。しかし、new演算子とdelete演算子の第一の......
06-10 | CからC++へ | Comment : 0  | Trackback : 0 
参照型
C言語のポインタには、大きく分けて以下の3つの役割があるかと思います。オブジェクトまたは関数に対するエイリアス動的オブジェクトの保持配列要素へのアクセスこれらは、それぞれ意味や目的が異なるわけですが、Cでは、意味や目的より、実現方法が同じものを同じ構文で記述する傾向にあります。それに対して、C++では、仮に実現方法が全く異なっていても、意味や目的が同じものを同じ構文で記述し、意味や目的が異なるものには別......
06-09 | CからC++へ | Comment : 0  | Trackback : 0 
構造体からクラスへ
前回までは、手っ取り早く説明するために構造体を対象としてきましたが、C++では、このような言語機能のことをクラスと呼びます。少なくともC++においては、構造体とクラスは全く別物ではなく、構造体はクラスの一種に過ぎません。また、共用体もクラスの一種であり、共用体にもコンストラクタ・デストラクタやメンバ関数、それにアクセス指定子などを使用することができます。オブジェクト指向を少しかじったことのある方なら、「......
06-09 | CからC++へ | Comment : 0  | Trackback : 0 
アクセス制御
前回、メンバ関数というのは、それが属している構造体のデータメンバ(フィールド)を操作するための関数だと書きました。しかし、実際には、構造体のデータメンバの操作は、メンバ関数でなくても、構造体へのポインタさえ引数として渡せば、どんな関数でもできてしまいます。このように、どこからでも構造体のデータメンバを操作できるようにしていると、グローバル変数が抱える問題と同じようなことが、構造体のデータメンバにも......
06-08 | CからC++へ | Comment : 0  | Trackback : 0 
メンバ関数
今回はメンバ関数について書くことにします。小難しい話は抜きにして、C++では、構造体のメンバとして、データだけではなく、関数を定義することができます。それが「メンバ関数」です。メンバ関数は、ごく大雑把にいうと、それが属している構造体のデータメンバ(フィールド)を操作するための関数です。コンストラクタやデストラクタも、実はメンバ関数の一種です。メンバ関数のことを「メソッド」と呼ぶ人もいますが、「メソッ......
06-08 | CからC++へ | Comment : 0  | Trackback : 0 
タグ名 == 型名
C言語では、構造体・共用体・列挙体は、typedef名を定義しない限り、struct Aのように、タグ名の前にstruct/union/enumを付ける必要がありました。しかし、C++では、タグ名だけで型名として扱うことができます。struct A{  int member;};A a;Cと同じようにtypedef名を定義してもよいのですが、その場合でも、タグ名を付けておかないと、コンストラクタやデストラクタを定義することができなくなります。特に理由がない限り、......
06-06 | CからC++へ | Comment : 0  | Trackback : 0 
コンストラクタとデストラクタ
C++とCとの最大の違いはクラスかもしれません。そのため、クラスに関しては詳しく書く必要があるのですが、「C++と組み込み環境」はあくまでもブログであって、C++の入門サイトではありませんので、きちんとした解説を望まれる方は入門書を読まれることをお勧めします*1。今回は、クラスへの導入として、コンストラクタとデストラクタの話題を取り上げてみたいと思います。説明を簡単にするために、Cと同様の構造体に、コンストラ......
06-03 | CからC++へ | Comment : 0  | Trackback : 0 
関数の多重定義
久々の更新ですが、今回は関数の多重定義について書いてみることにします。多重定義については、「C結合と多重定義」の回にも触れましたので、今回はもう少し初歩的な話題にしたいと思います。C言語では、やりたいことの意味が同じでも、引数の型や個数が異なれば、別の関数名を付けるしかありませんでした。具体的には、絶対値を求める関数は、引数がint型であればabs、long型であればlabs、double型であればfabsというように、型......
06-03 | CからC++へ | Comment : 0  | Trackback : 0 

C++と組み込み環境 | Page Top▲

Navigation
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。