Monthly Archives: August 2013

C++:クラスの使用例(2)> フレンド関数についての基本

C++でクラスでフレンド関数を使用するときのメモ。 フレンド関数 フレンド関数を使用すると、2つ以上のクラスの非公開メンバにアクセスすることが出来る。 フレンド関数のサンプルコード サンプルコードの補足説明 SampleClass の宣言の中でコンストラクタ関数と、フレンド関数 sum_it() を宣言している。 sum_it()関数は SampleClass のフレンドであるが、フレンドであるクラス SampleClass のメンバではない。そのため obj.sum_it(); のようにアクセス演算子を使用しフレンド関数を呼び出すことはできない。 フレンド関数からフレンドであるクラスの非公開要素にアクセスするためには、そのクラスのオブジェクトを介さなければいけない。 フレンド関数は継承されないため、基本クラスにフレンド関数が含まれていても、派生クラスのフレンド関数にはならない。 フレンド関数は複数のクラスのフレンドになることができる。 まとめ フレンド関数はオブジェクトを介せば複数クラスのメンバにアクセスし、異なるクラスの中の共通する要素を評価するといった使い方もできます。

C++:オブジェクトの配列とオブジェクトポインタ

CやC++において重要なポインタのオブジェクトポインタについてのメモ。 オブジェクトの配列とオブジェクトポインタについて オブジェクトの配列 オブジェクトは変数なので、変数の配列を宣言する方法でオブジェクトの配列を宣言できる。ここではSampleクラスのオブジェクトの2次元配列を作成し、初期化する処理をメモ。 サンプルコード オブジェクトポインタ オブジェクトポインタからオブジェクトへのアクセスはアロー演算子 -> を使用する。ポインタをインクリメントすれば次のオブジェクトを指す。 サンプルコード まとめ 変数もクラスも配列も全てオブジェクトなので、同じようにポインタが使用出来るということです。少しややこしく感じますがシンプルに考えるようにしましょう。

C++:クラスの使用例(1)> 関数へのオブジェクトの引渡し

C++でクラスを使用した関数へのオブジェクトの引渡しをメモ。 オブジェクトの引渡し 関数の引数にはオブジェクトを渡すことも出来る。今回はクラスを使って、オブジェクトを値渡しした場合と参照渡しをした場合の簡単なパターンをメモ。 値渡し(非参照型) ※関数内で値は変化するが、元の変数の値は変わらない。 参照型 ※参照渡しすることで、元の変数の値が書き換えられる。 補足説明 オブジェクトからクラスメンバにアクセスする場合にはドット演算子「 . 」 を使う。 ポインタからクラスメンバにアクセスする場合にはアロー演算子「 -> 」を使う。 関数へ引数を参照渡しする場合にはアドレス演算子「 & 」を使う。 まとめ 今回のサンプルコードのクラスにはデストラクタが含まれてないが、関数へオブジェクトを引き渡す場合自動的にオブジェクトのコピーが生成されるため、デストラクタが最低2回(関数終了時とプログラム終了時)呼ばれるので注意。 参照渡しやポインタがよく分からないうちは「元の変数を書き換えたいなら参照渡しする」と覚えておけばいいかと思います。

Apple:Stay hungry, stay foolish. スティーブ・ジョブズの言葉、名言を集めました

毎日お世話になっているApple製品とスティーブに感謝の意を込めて、個人的に大好きな彼の名言や関連する言葉を集めました。 ここで紹介する言葉はどれも自身がリアルタイムに体験してきたものばかりですので、言葉のピックアップだけでなく、いつ、どこで、どんなときに発した言葉なのかを、個人的な所感を含めた解説を交えながらメモしておきます。 スティーブ・ジョブズの言葉 貪欲であれ、愚かであれ。 スタンフォード大学の2005年卒業式で、スティーブがスピーチの最後に卒業生に向けた言葉。 この言葉自体は彼がオリジナルではなく、彼が影響を受けた Whole Earth Catalog という出版物の最終号で、発行者である Stewart Brand が残した言葉。 とてもシンプルでいい言葉です。愚かであり続けるために、ハングリーの矛先だけは間違えずにいたいものです。 君たちが持つ時間は限られている。人の人生に自分の時間を費やすことはありません。誰かが考えた結果に従って生きる必要もないのです。 同上。スタンフォード大学の2005年卒業式でのスピーチ。以下の言葉へと続く。 自分の内なる声が雑音に打ち消されないことです。そして、最も重要なことは自分自身の心と直感に素直に従い、勇気を持って行動することです。 同上。スタンフォード大学の2005年卒業式でのスピーチ。以下の言葉へと続く。 心や直感というのは、君たちが本当に望んでいる姿を知っているのです。だから、それ以外のことは、全て二の次でも構わないのです。 同上。スタンフォード大学の2005年卒業式でのスピーチ。このようにセンテンスで区切ってもそれぞれが独立して機能し、どれ一つ無駄のない言葉であることが分かります。 オーケー、誰も助けてくれないなら自分たちでやるまでだ。 1997年にスティーブがAppleに復帰、2000年のiMacの成功を期に、これまでMacを支え続けてくれたAdobeにソフトウェア制作を依頼するもAdobeはこれを拒否。そのときに発した言葉。この後、iPhoto,iMovieといったソフトウェア開発を自社で行う。 ありふれた言葉でも、彼が言うとバックグラウンドを知っているだけに格好良いですね。 もし今日が自分の人生最後の日だしたら、今日やることは私は本当にやりたいことだろうか? これもスタンフォード大学の2005年卒業式での言葉。 この言葉の後に「その答えがNoである日が何日も何日も続くようであれば、何か変えていく必要があると気がつくのです。」と続きます。 惰性で生きることに対する自戒の言葉です。惰性で生きることは、安易なリスク回避を自分の「時間」で買っています。時間の概念を「今」という木ではなく「人生」という森で考えると、この言葉の持つ本当の意味が理解出来る気がします。 マイクロソフトの唯一の問題は、彼らにまったくもってセンス(テイスト)がないことだ。彼らは絶対的にセンスがない。これは些細なことではなく、大きな問題だ。彼らには独自のアイディアがなく、製品にはカルチャー(文化)がない。 1996年 Triumph of the Nerds での発言。 Windows8はどうなんでしょうか。最近、Windows8に触れる機会があったのですが、タブレットとデスクトップのいいとこ取りをしたいのはUIを見れば一目瞭然なのですが、やっぱりセンスが感じられない気がします。 集団に着目しデザインするのはとても難しい。多くの場合、人は形にして見せてもらうまで、自分は何が欲しいのかわからないものだ。 1998年5月 BusinessWeek でのインタビューからの抜粋です。 「デザイン」と言う言葉はとくに日本においては物事の「外観」を指すことに使われる傾向にありますが、本来は物事の持つ特性を生かした機能を組み合わせ「設計」することを指し、それは「アイデア」にも似ていると思います。 人々が「欲しい物を作る」のではなく、「欲しがるであろうものを作る」チャレンジこそが本当のデザインなのかも知れません。 テレビは人々が欲しいものを与えるビジネスをしているにすぎない。それが真実だ。 1996年2月 Wired での言葉です。 前述したデザインとは対極に位置する存在がテレビなのかもしれません。 最近のテレビ番組が面白くないと感じているのであれば、それは視聴者が面白くなくなったと言うことです。番組制作者は視聴者の意見や反応(視聴率)に合わせて番組を作っているからです。 発想の転換をすれば、視聴者に「考える」というストレスを与えないようにデザインされている、と捉えることも出来ます。 また、スティーブは自身が創りだしたMacintoshというコンピュータを説明するとき次のように語っています。 あなたがテレビのスイッチをオンにするのは、あなたが自分の頭のスイッチをオフにしたいからだと思います。それに対してコンピュータで作業をするのは、頭のスイッチをオンにしたいからではないでしょうか。 たったひとつ、単純な事実に気づけば、人生は可能性がずっと開けたものとなる。それは、自分を取り囲んでいるすべてのもの、人生と呼んでいるものが、自分より賢いわけではない人々が作り出しているということだ。 1994年 PBS のドキュメンタリー番組 One More Thing のインタビューから。 人の数だけダイナミックな人生があってもいいはずですが、人もまた人という枠の中で本能的にリスク回避や種の保存をインプットされた生物です。これらを前提に人生を定義してしまうのはもったいないと言うことなのでしょう。 クレイジーな人たちがいる。反逆者、厄介者と呼ばれる人たち。彼らをクレイジーという人もいるが、私たちは天才だと思う。自分が世界を変えられると、本気で信じる人たちこそが、本当に世界を変えているのだから。 最後はスティーブ自身の言葉ではありませんが、1997年の有名なキャンペーンCM Think differentから。 ライターは Rob Siltanen と Ken Segall。 Think different のコピーはアメリカ合衆国の広告代理店 TBWA\CHIAT\DAY のアートディレクターだった Craig Tanimoto によるもの。 当時の色彩や音をテクノロジーにより再現することも可能になってしまいましたが、Think different のようにコンセプトさえ明確であれば、モノトーンで表現することで色彩を持つもの以上に鮮明に映ります。 10年以上経っても色褪せないAppleらしいプロモーション作品です。 まとめ スティーブ・ジョブズがこの世を去ってから「彼がいたらこんな製品やサービスは出なかった」「Appleは終わった」といった「ジョブズなきApple悲観論」をよく耳にします。 そんな方たちのために One More Thing(笑) 自分の一部であるAppleを追われ、1985年当時NeXTのトップだったスティーブ・ジョブスが、自身の仕事について語ったインタビューで次のような言葉を残しています。 「私の仕事は、何世紀にもわたって展示され人々に見られ続けるような絵画を作っているのではありません。何百年にもわたって人々からあがめられる教会を造っているのでもありません。開発してから10年たてば古くさくて廃れてしまうものを造っているのです。」 100年前がどうだったかは知るよしもありませんが、少なくとも今は永遠とか不変を求めるような時代ではなくなってしまいました。人や人の創りだすものに、そういった価値観を求めること自体がナンセンスなのかも知れません。 最後に、スティーブの逝去から約2週間後にアップル本社で行われた追悼式典で、現AppleCEOのティム・クックがスピーチの中で、スティーブが最後に残した言葉について話しています。 彼が遺したものは、(Appleの数々のアイデアや輝かしい製品のほかに)もう1つあります。それは我々全員です。彼がいなければ、90年代の終わりにAppleは潰れ、我々の多くが出会うことはなかったでしょう。彼の家族を除いて、Appleはスティーブが創り上げた最高のものです。 彼は最後の日までAppleについて考えていました。そして、「スティーブならどのように行動した?と問うな」というアドバイスを最後にくれました。「正しいと判断したことを、ただ遂行しろ」と。 ウォルト・ディズニーが亡くなったあとに誰もが「ウォルトなら何を望んだ?」と考えるようになってディズニーが麻痺したことを挙げ、アップルが同じ状況に陥らないように望んでいました。 スティーブが愛したAppleは、彼が愛した人たちが集まってできた集団なのですから、これからも素晴らしい体験を提供してくれると思っています。 ありがとう、スティーブ。 この記事がみなさんのお役に立ちましたら、ブックマークやSNSで共有していただければ幸いです。

C++:ポインタの概要(1)>ポインタについて

CやC++において重要なポインタについてのメモ。 ポインタについて ポインタを理解するために、変数やメモリの仕組みから順を追って説明します。 変数のアドレス すべての変数はメモリに記憶される。その記憶されたメモリの位置を16進数で表したものがアドレス。変数のアドレスはアドレス演算子 & でアクセスできる。 サンプルコード ※アドレスの値は環境により異なります。 ポインタの宣言とアドレスの格納 上記のアドレスを格納する変数が「ポインタ」。ポインタは型の後に*(アスタリスク)を使用し宣言する。 アスタリスクの位置はポインタ名の直前でも構わないが、後述する関節演算子と区別するため、ここでは int* とする。 サンプルコード ポインタから変数の値にアクセスする ポインタに変数のアドレスが格納されると、ポインタに 関節演算子 * を使用することで変数の値にアクセスすることができる。 サンプルコード ※int* 型の pVal というポインタを作成し、ポインタ pVal の値には *pVal でアクセスしていると考える。 ポインタから変数の値を変更する 関節演算子 * を使用しポインタに値を代入すれば、参照先の変数の値を変更することができる。 サンプルコード サンプルコードの変数とポインタの関係 val 変数val &val 変数valのアドレス pVal ポインタ(変数valのアドレスが格納されている) *pVal ポインタが指している変数(=変数valの値) 補足説明 int型のポインタ val を宣言するときは int* pVal; もしくは int *pVal; となる。このときの *(アスタリスク)はポインタの宣言を意味する記号であって、関節演算子を意味するものではない。 まとめ C や C++ を基礎から勉強しないまま Objective-C でコーディングしていたため、変数名の前に*が付いているとポインタだと思っていましたが、この考えは正確には間違いでした。 最近まで、なぜポインタ宣言のルールが統一されていないのかがずっと疑問でした。 「int型のポインタを宣言する」と考えれば int* pVal; となります。 ポインタの用途を考えれば、格納されているアドレスの16進数は人間にとって意味はなく、「同じアドレスを持つの変数の値を変更させる」使い方がポインタの役割と考えれば、宣言時にはポインタ使用時と同じ表記である int *pVal; を使用する方がスマートに感じます。 コーディングする人の考え方によって、どちらも間違っていないのですが、ポインタにアドレスを代入する際は関節演算子*を使用しないので、これがポインタをわかりにくくさせる原因の一つでした。 たった一文字の記号が左にあるか右にあるかで、その人の性格がでてしまうものなんですね。

C++:クラスの概要(4)> クラスと構造体の違い

C++において重要なクラスと構造体の違いについてのメモ。ここで言うクラスや構造体はC++のものを指します。 クラスと構造体 クラスとは 複数の変数や関数を持ち、単独で機能するモジュールのこと。 構造体とは もともとCにおいての構造体は複数の変数をひと固まりにして新しい型として定義するもの。 C++では構造体の機能が拡張され、クラスと同様、データ構造の中にコンストラクタやデストラクタ等の関数を含むことが出来る。 クラスと構造体の違い クラスのメンバはデフォルトで非公開(private)なのに対し、C++の構造体のメンバはデフォルトで公開(public)であることが違うのみで、機能的に両者はほぼ同じ。 C++での構造体の拡張構文 ※object-list は省略可 上記の構造体をクラスに書き換えると以下のようになる。 ※object-list は省略可 まとめ C++においてはクラスと構造体に大きな違いが見られないことから、メンバ関数を持つものはクラス、メンバ関数を持たないデータ集合であれば構造体、と使い分ければいい思います。

C++:クラスの概要(3)> オブジェクトポインタからメンバにアクセスする

C++において重要なクラスのオブジェクトポインタについてのメモ。 作業環境について サンプルコードは MacOS X 環境にて検証しています。一部の表記が Windows 環境でのソースと異なる部分(例えば “¥n” が “\n”)がありますが、基本動作には問題ありませんので、環境にあわせて書き換えて下さい。 オブジェクトポインタ ポインタとは ある変数のメモリ上のアドレスを指す変数。 参照渡し 関数の引数にポインタを渡すこと。参照渡しをすることで関数内で直接変数の値を書き換えることが出来る。 オブジェクトポインタの使用例 補足説明 オブジェクトのアドレスを取得する場合はオブジェクト名の前に &演算子 を挿入する。 オブジェクトからクラスメンバにアクセスする場合にはドット演算子を使う。 ポインタからクラスメンバにアクセスする場合にはアロー演算子を使う。 実行結果 まとめ CやC++の最初の難関でもあるポインタですが、分からないうちは使用を控え、メンバ関数から引数の値渡しに慣れることが先決です。 変数の値を処理していくうちに「値を変えたいのに出来ない」「値を処理するための関数やローカル変数が無駄に多くなる」という壁が立ちはだかりますので、おそらくそれらの問題点を解決してくれるのがポインタだと思います。

C++:関数のオーバーロード(多重定義)と関数テンプレート

関数のオーバーロード(多重定義)とC++の機能である関数テンプレートについてメモ。 関数のオーバーロード 関数のオーバーロードとは 引数の型や引数の数が違うもの同士であれば、同じ関数名で定義することが出来る仕組み。 関数のオーバーロードのコードサンプル 2つのint型の引数から最大値を求める関数 max() と、2つのdouble型の引数から最大値を求める関数 max() は関数名は同じだが引数の型が異なるためオーバーロード(多重定義)出来る。 事前に複数の処理をオーバーロードしておくことで、1つの関数名を覚えておけば引数の型や個数に応じた処理が行われる。 関数テンプレート 関数テンプレートとは 関数のひな形(テンプレート)を定義できる機能。関数内の処理手続きは同じである必要があるため、扱う型が異なる場合に使用することができる。 関数テンプレートの定義 関数テンプレートのコードサンプル #include using namespace std; //テンプレートの定義 template X maxt(X x, X y) { if ( x > y ) return x; else return y; } int main(int argc, const char * argv[]) { int a, b; double da, db; cout > a >> b; cout > da >> db; int result1 = maxt(a, b); double result2 = maxt(da, db); cout