[解決済み] 演算子のオーバーロード:メンバ関数と非メンバ関数?
質問
メンバ関数として宣言されたオーバーロードされた演算子は
非対称
というのは、パラメータをひとつしか持てず、自動的に渡されるもうひとつのパラメータは
this
ポインタです。そのため、両者を比較する基準は存在しない。一方、オーバーロード演算子として宣言されたものは
friend
は
対称
というのは、同じ型の二つの引数を渡しているので、比較することができるからです。
私の質問は、ポインタの lvalue を参照と比較できるのに、なぜ友人が優先されるのか、ということです。(非対称バージョンを使用すると、対称と同じ結果が得られます)。 なぜ STL アルゴリズムは対称バージョンのみを使用するのでしょうか?
どのように解決するのですか?
演算子オーバーロード関数をメンバ関数として定義した場合、コンパイラは以下のような式を変換します。
s1 + s2
を
s1.operator+(s2)
.
つまり、演算子オーバーロードされたメンバ関数が最初のオペランドで呼び出されることになります。
それがメンバ関数の動作方法です!
しかし、もし最初のオペランドがクラスでない場合はどうでしょうか?
最初のオペランドがクラス型でない演算子をオーバーロードしたい場合、大きな問題があります、むしろ、例えば
double
.
ですから、次のように書くことはできません。
10.0 + s2
. しかし、以下のような式に対して、演算子オーバーロードされたメンバ関数を書くことができます。
s1 + 10.0
.
これを解決するために
の順序
の問題を解決するために、演算子のオーバーロード関数を次のように定義します。
friend
にアクセスする必要がある場合
private
のメンバーにアクセスする必要があります。
にする。
friend
プライベートなメンバにアクセスする必要があるときだけ。
それ以外の場合は、単純に
非友人非会員
という機能を
向上させる
を向上させます。
class Sample
{
public:
Sample operator + (const Sample& op2); //works with s1 + s2
Sample operator + (double op2); //works with s1 + 10.0
//Make it `friend` only when it needs to access private members.
//Otherwise simply make it **non-friend non-member** function.
friend Sample operator + (double op1, const Sample& op2); //works with 10.0 + s2
}
これらを読んでください。
オペランドの順序に関する若干の問題
非メンバー関数がカプセル化を改善する方法
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み] なぜJavaには演算子のオーバーローディングがないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】構造体のベクター初期化について
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] 配列のベクトルを扱う正しい方法
-
[解決済み】変数やフィールドがvoid宣言されている