SlideShare a Scribd company logo
Boost.勉強会 #7 東京 ( 2011-12-03 )

C++ TIPS 2 インクリメント編
概要
 主に cppll ML でご紹介してきた tips をC++
 の仕様をより掘り下げた形でまとめ直し
 てみました。
 今回はインクリメントにフォーカスした
 内容です。


               C++ Tips Boost.勉強会 #7 東京   2
C++ Tips

インクリメント
インクリメントとは?
 プログラミング用語としてのインクリメント
  は値を+1したりあるいはイテレータなどを
  一つ進めることを意味し、デクリメントは逆
  に-1したり一つ戻したりすることを意味し
  ます。
 C言語およびC言語を文法のベースにしている
  多くの言語では ++ がインクリメント演算子
  として、 -- がデクリメント演算子と使えます。
           C++ Tips Boost.勉強会 #7 東京   4
インクリメントとは?
 インクリメント演算子もデクリメント演
  算子もひとつの値を対象とする単項演算
  子です。
 ++i のようにインクリメント演算子を演算
  対象の値の前に置くと前置インクリメン
  トと呼ばれi++のように値の前に置くと後
  置インクリメント呼ばれます。
          C++ Tips Boost.勉強会 #7 東京   5
インクリメントとは?
 ++i であっても i++ であっても i はインクリ
 メントされます。
 前置と後置の違いは式の評価値が、前置
 の場合はインクリメント後の値となり、
 後置の場合はインクリメント前の値とな
 ることです。

             C++ Tips Boost.勉強会 #7 東京   6
未定義動作
 関数引数内で同じ変数に大してインクリ
メントやデクリメントをやっちゃうと未
定義動作になってしまうので気をつけま
しょう。 int a = 0;
        ++a; // OK
        ++a; // OK
        f(++a, ++a); // NG
             C++ Tips Boost.勉強会 #7 東京   7
未定義動作
 ポインタや参照を使うと分かり難い形で
この未定義動作になってしまうことがあ
るので要注意です。

void f(int &a, int &b) { h(++a, ++b); }
void g(int &c) { f(c,c); } // NG


                 C++ Tips Boost.勉強会 #7 東京   8
インクリメントの定義
 C++ではユーザー定義のクラスであってもイ
  ンクリメント/デクリメントを定義できます。
 言語使用上はその中身は別にインクリメント
 /デクリメントに類する処理である必要はあ
 りません。
  ただ、混乱の元になるだけなのでインクリメント/
  デクリメントおよびそれに類する処理以外に使う
  のはやめておきましょう。

            C++ Tips Boost.勉強会 #7 東京   9
インクリメントの定義
class hoge {
  public:
    typedef hoge this_type;
    int value;
    this_type & operator ++ () { // 前置インクリメント
        ++value;
        return *this;
    }
    this_type operator ++ (int) { // 後置インクリメント
        this_type temp(*this);
        ++value;
        return temp;
    }
};                           C++ Tips Boost.勉強会 #7 東京   10
メンバー関数呼び出し風の使用
 通常のメンバー関数と同じ形式での呼び
出しも可能です。
 hoge hige;
 hige.operator++(); // 前置インクリメント
 hige.operator++(0); // 後置インクリメント



                C++ Tips Boost.勉強会 #7 東京   11
メンバー関数呼び出し風の使用
 後置インクリメントの引数は通常のメン
バー関数と同様に使おうと思えば普通に
使えます。
  通常のメンバー関数と同じ形式で呼び出す場
 合に限る話であり、i++ のような形式では呼び
 出し側から任意の値を渡すことはできません。


          C++ Tips Boost.勉強会 #7 東京   12
後置で複製を作らないには?
 デストラクタでインクリメントを行う一時オブ
 ジェクトを作ることで、後置インクリメントの
 実装で自身の複製を作らないようにすることも
 可能です。
  どのみち、なんらかの一時オブジェクトが必要である
   ことには変わりが無い。
  型が変わってしまうという副作用がある為、あまり推
   奨できません。
  複製のコストが高いクラスやストリームのイテレータ
   などで有効な手段となります。

            C++ Tips Boost.勉強会 #7 東京   13
どちらでもよい場合は前置
 通常、組み込み型以外の後置インクリメントではイン
  クリメント前のコピーである一時オブジェクトを返す
  ことになり、前置インクリメントでも構わない場合に
  後置インクリメントを使うことは無駄なコストを支払
  うことになるのでどちらでもよい場合は前置インクリ
  メントを使いましょう。
 組み込み型の場合はどちらでも気にする必要はありま
  せんが、統一性の観点やコード修正により変数の型が
  組み込み型でなくなった場合に備えて、組み込み型で
  も前置インクリメントを使いましょう。

            C++ Tips Boost.勉強会 #7 東京   14
C++ Tips

質疑応答
C++ Tips

ご清聴ありがとうございました。

More Related Content

PPTX
C++ tips1 #include編
PPTX
C++ tips 3 カンマ演算子編
PPTX
C++ tips4 cv修飾編
PPTX
競技プログラミングのためのC++入門
PDF
C++入門?
PPTX
C++0x総復習
PDF
競技プログラミングにおけるコードの書き方とその利便性
PPTX
エラーハンドリング
C++ tips1 #include編
C++ tips 3 カンマ演算子編
C++ tips4 cv修飾編
競技プログラミングのためのC++入門
C++入門?
C++0x総復習
競技プログラミングにおけるコードの書き方とその利便性
エラーハンドリング

What's hot (20)

PDF
C++ ポインタ ブートキャンプ
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
Effective Modern C++ 勉強会#1 Item3,4
PDF
templateとautoの型推論
PDF
君はまだ,本当のプリプロセスを知らない
PDF
F#によるFunctional Programming入門
PDF
第1回勉強会スライド
PDF
第2回勉強会スライド
PDF
Define and expansion of cpp macro
PPTX
Emcpp0506
PDF
Better C#の脱却を目指して
PDF
yieldとreturnの話
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
PPTX
T69 c++cli ネイティブライブラリラッピング入門
PDF
知って得するC#
PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
モナドハンズオン前座
PDF
Implicit Implicit Scala
PPTX
Effective modern C++ 勉強会 #3 Item 12
C++ ポインタ ブートキャンプ
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Effective Modern C++ 勉強会#1 Item3,4
templateとautoの型推論
君はまだ,本当のプリプロセスを知らない
F#によるFunctional Programming入門
第1回勉強会スライド
第2回勉強会スライド
Define and expansion of cpp macro
Emcpp0506
Better C#の脱却を目指して
yieldとreturnの話
C++コンパイラ GCCとClangからのメッセージをお読みください
T69 c++cli ネイティブライブラリラッピング入門
知って得するC#
最新C++事情 C++14-C++20 (2018年10月)
モナドハンズオン前座
Implicit Implicit Scala
Effective modern C++ 勉強会 #3 Item 12
Ad

Viewers also liked (19)

PDF
わんくま同盟大阪勉強会#61
PDF
Visual C++ 2015の紹介(C++11/14的に)
ODP
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
PDF
猫にはわからないGit講座
PDF
Github勉強会
PDF
Gitの使い方あれこれ
PDF
C++11やemscriptenと付き合って1年間の振り返り
PDF
ノンプログラマでも今日から使える「Git」でバージョン管理
PDF
コンセプトから理解するGitコマンド
PDF
Git flowの活用事例
PDF
はじめようGit
PDF
15分でわかるGit入門
PDF
やりなおせる Git 入門
PDF
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
PDF
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
PDF
デザイナのためのGit入門
KEY
一人でもはじめるGitでバージョン管理
PPT
セキュリティ業務の内製とチームメンバー育成
PDF
こわくない Git
わんくま同盟大阪勉強会#61
Visual C++ 2015の紹介(C++11/14的に)
大学でC++03を教わった私が、便利そうだと思ったC++11の新機能
猫にはわからないGit講座
Github勉強会
Gitの使い方あれこれ
C++11やemscriptenと付き合って1年間の振り返り
ノンプログラマでも今日から使える「Git」でバージョン管理
コンセプトから理解するGitコマンド
Git flowの活用事例
はじめようGit
15分でわかるGit入門
やりなおせる Git 入門
GitLab & web hooks & git-flowで実現する企業向けgit環境の構築
もしWordPressユーザーがGitを使ったら 〜WordPressテーマを共同編集しよう〜
デザイナのためのGit入門
一人でもはじめるGitでバージョン管理
セキュリティ業務の内製とチームメンバー育成
こわくない Git
Ad

Similar to C++ tips2 インクリメント編 (20)

PDF
C#勉強会
PPTX
Boost17 cpplinq
PPTX
boost - std - C#
PDF
NumPyが物足りない人へのCython入門
PDF
Wrapping a C++ library with Cython
ODP
Unity ネイティブプラグインの作成について
PPTX
C#や.NET Frameworkがやっていること
PDF
C++ lecture-0
PDF
C++0xの概要(デブサミ2010)
PDF
Swiftによる関数型プログラミング超入門
PDF
F#のinlineと型推論(狩)
PPTX
C++の復習
PDF
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
PPTX
.NETの自作ツール公開手段
PDF
What is template
PDF
Cython intro prelerease
PDF
はじめてのCodeIgniter
PPTX
Database, Polymorphism and Modern C++
PPTX
The evolution of c#
C#勉強会
Boost17 cpplinq
boost - std - C#
NumPyが物足りない人へのCython入門
Wrapping a C++ library with Cython
Unity ネイティブプラグインの作成について
C#や.NET Frameworkがやっていること
C++ lecture-0
C++0xの概要(デブサミ2010)
Swiftによる関数型プログラミング超入門
F#のinlineと型推論(狩)
C++の復習
[2001/05/30] .NET Developers Conference 2001 May / C#の生産性とパフォーマンス
.NETの自作ツール公開手段
What is template
Cython intro prelerease
はじめてのCodeIgniter
Database, Polymorphism and Modern C++
The evolution of c#

More from 道化師 堂華 (8)

PPTX
Reflection with xamarin.forms
PPTX
独りガラパゴス開発
PPTX
エラーハンドリングモデル考察
PPTX
C++プログラマの為のセキュリティ入門
PPTX
マスタリング バベル
PPTX
並列プログラミング 入門!&おさらい!
PPTX
バグベアード入門
PPTX
LUCIFERの設計コンセプトと 導入予定の機能紹介
Reflection with xamarin.forms
独りガラパゴス開発
エラーハンドリングモデル考察
C++プログラマの為のセキュリティ入門
マスタリング バベル
並列プログラミング 入門!&おさらい!
バグベアード入門
LUCIFERの設計コンセプトと 導入予定の機能紹介

C++ tips2 インクリメント編