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

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

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

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

Q&A

解決済

2回答

631閲覧

これは参照渡しされた変数にアドレスを代入しているのでしょうか

Tololololo

総合スコア118

C++

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

0グッド

0クリップ

投稿2019/06/10 11:03

編集2019/06/10 11:12

以下のコードを見てください。
関数a内で参照渡しされてきた変数に同じ型の別な変数を代入しています。

これは参照渡し(つまりアドレスとして)渡された変数に代入をするとアドレスを代入していることにになるという認識で間違い無いのでしょうか?

C++

1 2#include <iostream> 3#include <vector> 4using namespace std; 5 6struct Data{ 7 int aoi = 0; 8}; 9 10class A 11{ 12private: 13 std::vector<Data*> sender; 14public: 15 void a(std::vector<Data*> &getter); 16}; 17 18void A::a(std::vector<Data*> &getter) 19{ 20 for (int i=0; i<100; i++) { 21 sender.push_back(new Data); 22 } 23 getter = sender //ここは"アドレス"を書き換えているという認識で正しいですか? 24} 25 26int main() 27{ 28 29 A* aaa = new A(); 30 std::vector<Data*> sss; 31 aaa -> a(sss); 32 cout << sss[1]->aoi << endl; 33 return 0; 34}

追記
こんな感じでテストしてみるとなってるみたいです

C++

1 2#include <iostream> 3#include <vector> 4using namespace std; 5 6struct Data{ 7 int aoi = 0; 8}; 9 10class A 11{ 12private: 13 std::vector<Data*> sender; 14public: 15 void a(std::vector<Data*> &getter); 16 void b(); 17}; 18 19void A::a(std::vector<Data*> &getter) 20{ 21 for (int i=0; i<100; i++) { 22 sender.push_back(new Data); 23 } 24 getter = sender; 25} 26 27void A::b() 28{ 29 cout << sender[1]->aoi << endl; 30 sender[1]-> aoi = 9; 31} 32 33int main() 34{ 35 36 A* aaa = new A(); 37 std::vector<Data*> sss; 38 aaa -> a(sss); 39 sss[1]->aoi=1111; 40 cout << sss[1]->aoi << endl; 41 aaa -> b(); 42 cout << sss[1]->aoi << endl; 43 return 0; 44}

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

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

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

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

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

episteme

2019/06/10 12:22

どーでもいいけど、 sender⇔receiver, setter⇔getter だからね。
guest

回答2

0

getter = sender; //ここは"アドレス"を書き換えているという認識で正しいですか?

解決済みになっている問題で申し訳ありませんが、私は
「"アドレス"を書き換えているという認識」が正しいとは思いません。

sender は 10個のアドレスを要素に持つ vector です。
getteer は参照で、実体は main の sss です。
sss は 要素数が 0個の vector です。
要素がないのでアドレスを持っていません。

getter = sender; は sss = sender; で vector のコピーです。
結果的には sss は 10個のアドレスを要素に持つことになりますが、
アドレスを書き換えているとは言いたくありません。

sed::vector<Data*> sss(10); と宣言されていて、最初から sss が nullptr
を 10個持っていたら、アドレスを書き換えたといっても構いません。

投稿2019/06/11 04:45

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

getter = sender //ここは"アドレス"を書き換えているという認識で正しいですか?

であるなら、その後 getter[0] を書き換えると setter[0] も書き換わるハズ。やってみて。

[追記] 勘違いされても困るから:

C++

1#include <iostream> 2#include <vector> 3using namespace std; 4 5struct Data{ 6 int aoi = 0; 7}; 8 9class A { 10public: 11 std::vector<Data*> sender; 12public: 13 void a(std::vector<Data*> &getter); 14}; 15 16void A::a(std::vector<Data*> &getter) { 17 for (int i=0; i<10; i++) { 18 sender.push_back(new Data); 19 } 20 getter = sender; //ここは"アドレス"を書き換えているという認識で正しいですか? 21} 22 23int main() { 24 25 A* aaa = new A(); 26 std::vector<Data*> sss; 27 aaa -> a(sss); 28 29 // aaa->sender[0] を書き換えて 30 Data* p = new Data(); p->aoi = 9; 31 aaa->sender[0] = p; 32 // 両者をプリント 33 for ( Data* item : sss ) { cout << item->aoi << ' '; } cout << endl; 34 for ( Data* item : aaa->sender ) { cout << item->aoi << ' '; } cout << endl; 35 return 0; 36}

実行結果

0 0 0 0 0 0 0 0 0 0 9 0 0 0 0 0 0 0 0 0

ってことで、コピーされてるね。

投稿2019/06/10 11:23

編集2019/06/10 12:34
episteme

総合スコア16614

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

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

kazuma-s

2019/06/11 08:22

sss[0] と aaa->sender[0] は別々の Data を指している。 sss[1] と aaa->sender[1] は同じ Data を指している。  ... sss[9] と aaa->sender[9] は同じ Data を指している。 この new された 11個の Data を deleteするとすれば、 誰がどうやって delete するのでしょうか?
episteme

2019/06/11 11:01

考えろよそのくらい
episteme

2019/06/11 19:11

set<Data*> dead; を用意し、「Data* x をdeadにinsertする。insertできたら delete x、できなかったら何もしない」をくりかえす。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問