解決
それはあなたが必要性を感じた場合、オーバーロードすることがあります。すべての定義済みの型のために、それは本質的に-OPません。
ノーオペレーション単項演算器の実用的な用途がかなり限られており、むしろオペレータ自体よりも、演算式の値を使用しての結果に関連する傾向があります。例えば、int
、または発現の結果は右辺値として扱われ、したがって非const
基準パラメータと互換性がないことを保証するために、より小さな整数型から拡大強制するために使用することができます。私は、これらの用途は、読みやすさよりも、コードゴルフに適していること、しかし、提出します。 : - )
他のヒント
実際には、単項プラスのないの何かをします%28VS.80%29.aspx」REL = 『noreferrer』>通常の算術変換する オペランドにEM>と大きな幅の整数とすることができる新たな値を返します。元の値がint
より小さい幅の符号なし整数である場合、それは同様signed
値に変更されます。
通常、これは、重要ではありませんが、それは「コメント」を示すの一種として単項プラスを使用するために、のないの良いアイデアですので、それがは、影響を与える可能性があります整数が正であること。次のC ++のプログラムを考えてみます:
void foo(unsigned short x)
{
std::cout << "x is an unsigned short" << std::endl;
}
void foo(int x)
{
std::cout << "x is an int" << std::endl;
}
int main()
{
unsigned short x = 5;
foo(+x);
}
これは、 "xはintです" と表示されます。
単項プラス異なるタイプとの符号の有無に新しい値を作成し、この例ではそう。
K&R第二版から
単項+は、ANSI標準で新しく追加されました。それは単項で対称性のために追加されました - ます。
私はそれが負の値とは異なり正の値を強調するために、明確にするために使用を見てきました
shift(+1);
shift(-1);
しかし、それはかなり弱いの使用です。答えは間違いなくオーバーロードしている。
ビルトイン単項+
がないことの一つは、右辺値に左辺値回しています。たとえば、あなたがこれを行うことができます。
int x;
&x;
しかし、あなたがこれを行うことはできません。
&+x;
:)
P.S。 「オーバーロード」間違いなく正しい答えではありません。単項+
はCから継承し、Cでオーバーロードはユーザーレベルのオペレータがありません。
+単項を実現主なものは小さく、より-INTデータ型のint型への型のプロモーションです。あなたが数値データとしてstd::cout
を使用して文字データを印刷しようとしている場合、これは非常に便利なことができます。
char x = 5;
std::cout << +x << "\n";
は、
とは非常に異なっていますchar x=5;
std::cout << x << "\n";
また、オーバーロードのために利用可能なのですが、実際には、あなたのオーバーロードは、のはほぼNOPである必要があります。
、単項+は、印刷コードを簡素化することができます。考えてみましょう。
char c = 42;
cout << c << endl; // prints "*\n", not what you want in this case
cout << (int)c << endl; // prints "42\n", ok
cout << +c << endl; // prints "42\n", much easier to type
これは単なる簡単な例です。私は単項+がより多くの代わりのようなテキストの数のようなあなたのバイトの治療に役立つことができ、他の時間があると確信しています。
歴史ちらほら。浮動小数点定数式の変換時の評価の阻害:C99の標準化委員会はまた、彼らの言語で別の機能を実現するために、それを再利用すること考慮しても明らかなように、単項の既存の用途を考えプラスかなりまれでした。 C理由から、以下の引用文を参照してください、セクションF.7.4ます:
この仕様許さ変換時の初期バージョン定数算術が、 単項+演算子を権限を与え、オペランドに適用された場合、変換時を阻害します 定数式の評価ます。
最後に、セマンティクスは、ランタイム(少なくとも原則「の場合のように」まで)ほとんどのコンテキストに施行評価、および静的初期化子を使用して変換時の評価を実施する能力と、逆転しました。存在する場合、主な違いは、浮動小数点例外の発生であることに注意し、他の浮動小数点丸めまたは精度の設定
あまり。 operator+()
の過負荷を可能にするための一般的な引数は間違いなく現実の世界はoperator-()
をオーバーロードするために使用し、あなたがoperator-()
の過負荷を可能にするが、operator+()
ないとしたら、それはの非常にの奇妙な(または非対称)だろうがあるということです。
の私は、私が最初にStroustropからこの引数を読むことを信じて、私は右のそれを確認するために私と私の本を持っていません。私は間違っているかもしれません。の
単項プラス、それは(多くのauto
キーワードなど)は絶対に何もなかったC、中に存在していました。それを持っていないためには、Stroustrup氏は、Cと無償の非互換性を導入しなければならなかっただろう。
それはC ++になったら、それだけで単項マイナスと同様、オーバーロード機能を可能にする自然なことでした、そして、それは既に存在しなかった場合Stroustrup氏はその理由のためにそれを導入している場合があります。
だから、それは何を意味します。例えば-1.5と反対として1.5を使用して、物事をより対称的に見えるように装飾の一種としてとして使用することができます。 C ++では、それが過負荷状態にすることができますが、operator+()
が何かをしなければ混乱することになるだろう。標準のルールを覚えておいてください:算術演算子をオーバーロードするとき、int
sようなことはしますか。
それはありますなぜあなたは理由を探しているなら、私はCが実際に設計されていなかったとして、何の正当な理由が、ありませんでした容疑者Cの初期の歴史について何かを見つけます。無用auto
キーワードを考えてみましょう(おそらく今C ++ 0xの中でリサイクルさstatic
、とは対照的に)、そして何もしなかった(以降C90は省略)決してentry
キーワード、。リッチーやカーニハンが、彼らは演算子の優先順位は、問題を抱えていた気づいたとき、彼らは壊したくなかった何千行ものコードと3回のインストールがすでにあった、と言うここで有名な電子メールがあります。
できない引用は、"このいわれは明示的なタイプの促進というウンド型に変換します。ることを知っていただくことで、トップの変換階層
- 振興
new_type operator+(old_type)
- 変換:
new_type(old_type)
- 出演:
operator(new_type)(old_type)
- 強制:
new_type operator=(old_type)
もちろん、これからの私の解釈の注意事項の一つには、microsoft(旧)c/c++のマニュアルを読み込みまで約15年前ぐらいまでは、結晶粒の塩です。
#include <stdio.h>
int main()
{
unsigned short x = 5;
printf ("%d\n",sizeof(+x));
printf ("%d\n",sizeof(x));
return 0;
}
上記の例に示すように、、単項+は実際、それぞれのタイプ、サイズ4及び2を変化させます。表現+ xが実際のsizeofで計算されていることを奇妙な、私はそれがになっていないと思いました。おそらくそれはのsizeofは単項+と同じ優先順位を持っているという事実によるものです。
私はあなたが常に正の数を作るためにそれを使用する可能性があるとします。ただ、腹筋する単項+演算子をオーバーロード。あなたが本当に自分のコードを難読化する場合を除き、あなたの仲間の開発者を混乱させ、本当に価値がありません。そして、それがうまく動作すると思います。
編集書き直し完全に、私はwaaaayyy私のオリジナルの答えではオフだったので。
これは、あなたが正の値として、あなたのタイプの明示的な宣言を処理できるようにする必要があります(私は主に非数学的な操作で考えます)。否定がより有用であろうと思われるが、私はここにそれが違いを生む可能性がある場所の例だと思います:
public struct Acceleration
{
private readonly decimal rate;
private readonly Vector vector;
public Acceleration(decimal rate, Vector vector)
{
this.vector = vector;
this.rate = rate;
}
public static Acceleration operator +(Acceleration other)
{
if (other.Vector.Z >= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public static Acceleration operator -(Acceleration other)
{
if (other.Vector.Z <= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public decimal Rate
{
get { return rate; }
}
public Vector Vector
{
get { return vector; }
}
}