7
int a, b, c; 

//do stuff. For e.g., cin >> b >> c; 

c = a + b;          //works 
c = operator+(a,b); //fails to compile, 'operator+' not defined. 

一方、これは機能します-

class Foo
{
 int x; 
public:
 Foo(int x):x(x) {} 

 Foo friend operator+(const Foo& f, const Foo& g)
 {
  return Foo(f.x + g.x); 
 }

};    

Foo l(5), m(10); 

Foo n = operator+(l,m); //compiles ok! 
  • プリミティブ型(intなど)のoperator +(およびその他の演算子)を直接呼び出すことも可能ですか?
  • はいの場合、どのように?
  • そうでない場合、これが実行可能ではないことを明確にするC ++参照の言い回しはありますか?
4

2 に答える 2

8

まず、組み込み演算子を関数として呼び出すことは、言語仕様でそのような関数が存在するとは決して述べられていないという理由だけでは機能しません。組み込み演算子は単なる演算子です。言語仕様がそれらの存在を示唆しないという理由だけで、それらの背後に実装機能はありません。関数ベースの実装は、オーバーロードされた演算子のみに固有です。

第二に、過負荷の解決中、組み込み演算子は実際にそれらの想像上の関数のような対応物によって表されますが、組み込み演算子の「明示的な」関数のような呼び出しを禁止する文言は13.6/1に存在します

5節で定義された組み込み演算子を表す候補演算子関数は、この節で指定されます。これらの候補関数は、13.3.1.2で説明されているように、演算子の過負荷解決プロセスに参加し、他の目的には使用されません

于 2010-10-31T00:13:48.407 に答える
2

http://www.parashift.com/c++-faq-lite/intrinsic-types.htmlから

組み込み/組み込み/プリミティブ型で機能する演算子のオーバーロードを定義できますか?

いいえ、C ++言語では、演算子のオーバーロードで「クラス型」または列挙型のオペランドを少なくとも1つ使用する必要があります。C ++言語では、すべてのオペランド/パラメーターがプリミティブ型の演算子を定義することはできません。

たとえば、2つのchar *を取り、文字列比較を使用するoperator==を定義することはできません。s1とs2がchar*型の場合、式s1 == s2はすでに明確に定義された意味を持っているため、これは朗報です。つまり、2つのポインターが指す2つの文字列ではなく、2つのポインターを比較します。とにかくポインタを使うべきではありません。char*の代わりにstd::stringを使用します。

C ++で組み込み型の演算子の意味を再定義できる場合、1 + 1が何であるかはわかりません。これは、含まれるヘッダーと、それらのヘッダーの1つが加算を再定義して、たとえば減算を意味するかどうかによって異なります。 。

C++標準§13.5.6

演算子関数は、非静的メンバー関数または非メンバー関数のいずれかであり、タイプがクラス、クラスへの参照、列挙型、または列挙型への参照であるパラメーターを少なくとも1つ持つ必要があります。演算子の優先順位、グループ化、またはオペランドの数を変更することはできません。タイプごとに事前定義された演算子=、(単項)&、および、(コンマ)の意味は、これらの演算子を実装する演算子関数を定義することにより、特定のクラスおよび列挙型に対して変更できます。演算子関数は、他の基本クラス関数と同じ方法で継承されます。

于 2010-10-30T23:53:10.463 に答える