+記号演算子のリロードと参照の関係
2705 ワード
文章の一部の内容は、ユーザーの夕暮れを知っている文章を参考にしています.に感謝♥ ♥この記事のアドレス:https://zhuanlan.zhihu.com/p/...
左参照の定義
プログラムでよく使用される参照は左の参照です(右の参照はC++11の新しい特性であり、ここでは議論しません).まず、左の参照を見てみましょう.
参照の本質はポインタ定数であり、
これは、10がアドレス取得操作を行うことができず、すなわち、メモリではなくレジスタに格納されているため、即時数に対してアドレスを取得することができないためである.しかし、定数10を引用するにはどうすればいいのでしょうか.通常のリファレンスを使用できます.
上のコードはコンパイルできます.定数10を参照するために通常引用を使用すると、メモリに一時変数が生成され、一時変数はアドレスを取ることができるからです.次のようになります.
要約すると、左の値の参照は右の値がアドレスを取得しなければならないことを要求します.アドレスが取得できない場合は、通常参照を使用する必要があります.ただし、通常の参照を使用すると、参照によってのみデータを読み取ることができ、データを変更することはできません.
プラス記号演算子のリロード
studentクラス、studentを定義します.hファイルは以下の通りである.
student.cppファイル:
main.cppファイル:
答えてるhの2つの疑問の前に,左値と右値の意味も理解しなければならない.C++では左値と右値には標準的な定義はありませんが、以下の言い方は一般的に認められています.
では、即時数、関数が返す値、匿名オブジェクトが右値(この点が重要すぎて、本論文の真髄)、非匿名オブジェクト(変数を含む)、関数が返す参照です.
もう一度見てみろcppの+号リロード関数は、値を返します!!!では、mainを見てみましょう.cppの
<
左参照の定義
プログラムでよく使用される参照は左の参照です(右の参照はC++11の新しい特性であり、ここでは議論しません).まず、左の参照を見てみましょう.
int a = 10;
int &b = a; //
b = 100; //
参照の本質はポインタ定数であり、
int &b = a
はint* const b = &a
である.この点が分かれば,以下のコードがコンパイルできない理由が理解できる.int &b = 10;
これは、10がアドレス取得操作を行うことができず、すなわち、メモリではなくレジスタに格納されているため、即時数に対してアドレスを取得することができないためである.しかし、定数10を引用するにはどうすればいいのでしょうか.通常のリファレンスを使用できます.
const int &b = 10;
上のコードはコンパイルできます.定数10を参照するために通常引用を使用すると、メモリに一時変数が生成され、一時変数はアドレスを取ることができるからです.次のようになります.
const int temp = 10; // temp
const int &b = temp;
要約すると、左の値の参照は右の値がアドレスを取得しなければならないことを要求します.アドレスが取得できない場合は、通常参照を使用する必要があります.ただし、通常の参照を使用すると、参照によってのみデータを読み取ることができ、データを変更することはできません.
プラス記号演算子のリロード
studentクラス、studentを定義します.hファイルは以下の通りである.
#pragma once
#include
using namespace std;
class student
{
friend ostream& operator<
student.cppファイル:
#include "student.h"
student::student(int weight, int height)
{
mPWeight = new int(weight);
mPHeight = new int(height);
}
student::student( const student& stu)
{
mPWeight = new int(*stu.mPWeight);
mPHeight = new int(*stu.mPHeight);
}
student student::operator+(const student& stu)
{
student temp(*mPWeight + *stu.mPWeight, *mPHeight + *stu.mPHeight);
return temp;
}
student::~student()
{
if (mPWeight != NULL)
{
delete mPWeight;
mPWeight = NULL;
}
if (mPHeight != NULL)
{
delete mPHeight;
mPHeight = NULL;
}
}
main.cppファイル:
#include"student.h"
ostream& operator<
答えてるhの2つの疑問の前に,左値と右値の意味も理解しなければならない.C++では左値と右値には標準的な定義はありませんが、以下の言い方は一般的に認められています.
, , ;
, , 。
では、即時数、関数が返す値、匿名オブジェクトが右値(この点が重要すぎて、本論文の真髄)、非匿名オブジェクト(変数を含む)、関数が返す参照です.
もう一度見てみろcppの+号リロード関数は、値を返します!!!では、mainを見てみましょう.cppの
student student3 = student1 + student2;
は、student 1+student 2が匿名オブジェクトを返す(便宜上、tempで匿名オブジェクトを表す);studentクラスのコピーコンストラクション関数を呼び出します.const student&stu=tempです.ここを見て、分かったはずです.もし:student& stu = temp;
であれば、tempは右値であり、アドレスを取ることができず、左値参照も使用できません.定数参照を構成するにはconstを追加する必要があります(ステップ第1部:左値参照の定義).これでコンパイルできます.したがって、コピーコンストラクション関数の形がconstに参加する理由は、送信されたオブジェクトの内容が変更されることを防止することだけではありません.コピーコンストラクタを書くときはconstを付けなければなりません<