演算子定義の例とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > 演算子定義の例の意味・解説 

演算子定義の例

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/09 03:38 UTC 版)

利用者定義演算子」の記事における「演算子定義の例」の解説

Smalltalkによる例: Object subclass: #Value instanceVariableNames: 'value' classVariableNames: '' poolDictionaries: '' category: 'Example'.Value createGetMethod: 'value' default: 0; createSetMethod: 'value'.Value methodsFor: 'accessing'!species " 演算子戻り値型としてValue自身を使う。 " ^ Value.!!" '+' 演算子と '-' 演算子の定義。 "Value methodsFor: 'operator'!+ aNumber ^ self species with: self value + aNumber.!- aNumber ^ self species with: self value - aNumber.!!Value methodsFor: 'instance creation'!with: aNumber ^ super new value: aNumber.!!| value0 value1 value2 |value1 := Value with: 10.value2 := Value with: 5." 利用者定義演算子使用したため各変数には整数オブジェクトではなくValueクラスオブジェクト代入されている。 "value0 := value1 + value2.value0 := value1 - value2. Smalltalkにおいてはメソッド記号だけで構成されるセレクターをつけることで利用者定義演算子定義することができる。Smalltalkでは演算子2項セレクターとよび#with:など英数でできたセレクターとほぼ同様に扱う。Smalltalkにおいて演算子メッセージ一種という扱いであり引数が必ず1個で優先順位異なる点以外は特別扱いはしないこのため演算子として定義できる記号には殆ど制限がない(ただし区切り用の記号代入記号指定できない)。また、演算子として定義する記号は2文字でもよく->や~=といった演算子がよく定義されている。Smalltalk多重定義できないため一つクラスに同じ演算子複数定義することはできない。ただし、インスタンスオブジェクトとクラスオブジェクトは同じクラス紐づくものの別のオブジェクトであるためインスタンスメソッドとクラスメソッドで同じ演算子定義することが可能になっている。 C++による例: class Value{ int value;public: Value( int value ): value( value ) { } // '+' 演算子の定義。 Value operator + ( Value const &source ) const { return Value( source.value + value ); } // '-' 演算子の定義。 Value operator - ( Value const &source ) const { return Value( source.value - value ); } // 単項演算子版の'-'演算子の定義。 Value operator - (void) const { return Value( -value ); }};// 大域関数演算子の定義。Value operator + ( int left, Value const &right ){ return Value( left ) + right;}Value operator - ( int left, Value const &right ){ return Value( left ) - right;}int main(void){ Value value0( 0 ), value1( 10 ), value2( 5 ); // 利用者定義演算子使用しているためどの変数数値型ではなくValueになっている。 value0 = value1 + value2; value0 = value1 - value2; // メンバー関数では1項目はValue型でなければならないが大域関数定義しているため1項目に数値指定できる。 value0 = 10 + value2; value0 = 10 - value2; return EXIT_SUCCESS;} C++においてはoperatorキーワードの後に記号をつけた形の特殊な名前を持つ関数定義することで演算子定義できるC++では言語機能として用意されている演算子しか定義できず独自の記号用いた演算子定義することはできないまた、演算子引数戻り値の型は演算子の種類によって制限される例えば型のメンバー指定する->演算子単項演算子として独自に定義したり、数値型や->演算子定義していない型を戻り値の型として指定することはできない多く制限があるなか下記のような通常の関数異な演算子独自の振る舞いをする演算子があり通常の関数では不可能な構文記述することができるようになっているSmalltalkでは2項演算子しか定義することはできないが+x -xといった単項演算子は勿論x[i]といった添字演算子やx( a, b, c )といった関数呼出演算子なども定義することができる。 C++多重定義可能な言語であり、利用者定義演算子多重定義枠組み入っている。このためSmalltalk異なり引数異な場合限って同じ名前空間で同じ名前の演算子複数定義することが可能となっている。ただし、既存演算子上書きすることになってしまうた数値型だけを引数とする演算子の定義はできない演算子宣言名称振る舞い応用operator Type() 型変換キャスト演算子 Type 型を返すType 型への暗黙的な変換が可能となる。呼び出しにはstatic_castなどのキャスト構文による明示的な型変換使えるC++11以降では、暗黙的な型変換抑止して、明示的な型変換強制するexplicit修飾子指定するともできる応用例のようにif文while文条件式などで用いbool型変換演算子の定義として用いられるほか、アトミック変数のクラステンプレートの内部型への暗黙変換などにも用いられるstd::unique_ptr pointer( new std::string( "hoge" ) );// 以下では std::unique_ptr::operator bool()呼ばれる。if( pointer ) { /* ptr 内部管理されるポインターNULLない場合 */ } Type operator->() アロー演算子 Type 型を返す通例ポインター型T*を返し、Tのメンバー使用できるように実装することで、疑似的ポインター型を定義することができる。応用例のようなスマートポインターや排他[要説明]などのためによく用いられるstd::shared_ptr< std::vector > pointer( new std::vector() );// 以下では std::shared_ptr::pointer operator->()呼ばれるpointer->push_back(0);// push_back()std::vectorメンバーだが、std::shared_ptr のメンバーではない。

※この「演算子定義の例」の解説は、「利用者定義演算子」の解説の一部です。
「演算子定義の例」を含む「利用者定義演算子」の記事については、「利用者定義演算子」の概要を参照ください。

ウィキペディア小見出し辞書の「演算子定義の例」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「演算子定義の例」の関連用語

演算子定義の例のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



演算子定義の例のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの利用者定義演算子 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS