質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

2474閲覧

引数として&を使い、{}では&を外すパターンと両方に&をつけるパターンの違い

reotantan

総合スコア295

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2015/11/07 21:22

bool Dummy::isitme(Dummy &param){
if(&param==this)return true;

上のコードで引数として参照を使っているので、if文の中にはparamだけではいいのではないかと思い、&を消したところエラーが発生しました。
どこかの例文で引数では&を使い、{}内では&を外していたという事を思い出し、混乱しています。
&をつけて&を外す文と&を両方につける意味上の違いを説明していただけると、とてもうれしいです。

コード #include<iostream> #include<sstream> #include<string> using namespace std; class Dummy{ public: bool isitme(Dummy &param); }; bool Dummy::isitme(Dummy &param){ if(&param==this)return true; else return false; } int main(){ Dummy a; Dummy *b=&a; if(b->isitme(a)) cout<<"yes,&a is b\n"; return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

bool Dummy::isitme(Dummy &param){での&参照渡しを表す&です。Dummy型のparamを参照渡しで引数に取りますという意味です。param自体はDummy型です。もし、&が無い場合は、引数が値渡しになります(その場合も、param自体はDummy型です)。

if(&param==this)return true;での&アドレス演算子& です。&paramの所は「paramのアドレスの値」という意味で有り、Dummy *型です。もし、&が無い場合は、ただのparamであり、Dummy型です。thisは自分自身のポインタを表すのでDummy *型です。&があれば型は同じで比較できますが、&が無いと型が不一致となり、エラーとなります。

このように&は文脈によって意味が変わってきますので、どちらの意味で使われているのか意識するようにしてください。そうすれば、自ずと疑問が解けていくかと思います。

投稿2015/11/07 22:11

raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

おそらく、アドレスの演算子の & と、参照変数の型指定の & がごっちゃになってるのだと思います。

C++

1bool Dummy::isitme(Dummy &param){ 2 if(&param==this)return true; 3 else return false; 4} 5

最初の & は参照変数の定義で、
2番目の & は参照云々ではなく paramのアドレスを取得する演算子になると思います。

「参照変数は型名に & をつけて宣言します」が、それを使う時は&をつけずに変数そのものを指定します。

言い換えれば、参照変数の宣言時以外に表れる & は、アドレス演算子になるんじゃないのかな?

投稿2015/11/07 22:07

T.Kanno

総合スコア915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

こんにちは。
なかなかハードな部分を頑張ってますね。

bool Dummy::isitme(Dummy &param){
if(&param==this)return true;

(Dummy &param)ではなく
(Dummy& param)と考えると良いです。

「型」と変数の間にある&は、「型」に付きます。
Dummy&は、「Dummyクラスへの参照」と言う新たな型です。
paramは、「Dummyクラスへの参照」型として定義されました。

「型」が無い時の&は変数に付きます。
&paramは、paramが参照ですから「paramの参照先」を指すポインタ(アドレス)となります。
そして、thisは自分自身へのポインタ(アドレス)ですね。
ですので、(&param==this)は、paramの参照先のアドレスと自分自身のアドレスが等しい時trueになります。
つまり、paramに自分自身が渡された時、trueになりますね。

&をつけて&を外す文と&を両方につける意味上の違いを説明していただけると、とてもうれしいです。

無理っと説明してみます。(できれば、&が付いてない時の例を示して頂けると説明しやすいです。)
if (param==this) return true;
と書くこともできます。
この場合、paramと
thisのアドレスではなく、中身が比較されます。中身が等しい時にtrueになります。
ただ、Dummyクラスには中身が無いのでこの例では意味が無いですが。

投稿2015/11/08 02:26

編集2015/11/08 02:32
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問