dポイントプレゼントキャンペーン実施中!

Javaを先に学習し、現在C++を学習中の者です。

Javaでは、プリミティブ型の変数以外は変数自体にアドレスが格納されていました。
よって、例えば以下のようにオブジェクトのアドレスを共有したい場合は以下のようにする必要がありました。
String s1 = "";
String s2 = s1;
これでs1をnewしない限り、変更するとs2も情報が変わるはずです。

そこで疑問に思ったのですが、C++では上記のようなことをする場合、ポインターを利用すると思っています。例えば上記のJavaと同じようなことをしたければ、以下のようにすればいいと思います(stringはchar[]のtypedefなのでちょっと違うのかもしれませんが…)。
string *s1 = new string("");
string *s2 = s1;

ところで、C++では、ポインターではない変数自体は何を意味するのでしょうか?
今までの例でいうと、
string s3 = "";
このs3の事です。例えば以下のようにした場合、
string s4 = s3;
s3の情報をnewせずに書き換えると、s4の情報はどうなるのでしょうか?C++でのプリミティブの場合も含めて説明していただけると幸いです。

よろしくお願いします。

A 回答 (2件)

> String s1 = "";


> String s2 = s1;
> これでs1をnewしない限り、変更するとs2も情報が変わるはずです。
(話題の本質とはあまり関係ないですが)JavaのStringはimmutableなのでそもそも変更できないと思います。

> そこで疑問に思ったのですが、C++では上記のようなことをする場合、ポインターを利用すると思っています。
ポインタでもいいですが、参照でもできそうですね。

> (stringはchar[]のtypedefなのでちょっと違うのかもしれませんが…)。
std::stringのことならchar[]のtypedefなどではありませんよ。

> C++では、ポインターではない変数自体は何を意味するのでしょうか?
値そのものが入っているといえばいいでしょうか。Javaのintとかと同じですよ。

> string s3 = "";
> string s4 = s3;
s3の値がs4にコピーされます。intなどのプリミティブ型と同じです。
(Javaではプリミティブ型以外は参照型になりますが、C++ではクラスも値型です。)

というか、実際に試して見てはどうでしょう。C++の環境はないですか?(勉強しているなら無いと困る気がしますが・・・。)
    • good
    • 0
この回答へのお礼

値そのものが入っているというのは予想外でした。値がコピーされるということは、そのクラスのもつメンバーすべてをコピーするということですか。Javaを学んだ自分からすると驚きです。

C++環境はあるのですが、実際どう結果を吐くかというより、文法的に、意味的にどういうことかが気になっていたので質問させて頂きました。ですが自分で結果を出してから質問するべきでした。

C++における参照という概念も自分が知らないものでした。C++も面白いですね。

ありがとうございました。

お礼日時:2011/11/02 03:07

「C++ では」という一般化は無理です.



Hoge a;
Hoge b = a;
とした場合, 普通は Java の値型と同じように
a と b はこの時点で同じだけどこのあとで a を変更しても b は変わらない
とするでしょうが, それなりにクラスを作れば
Java の参照型と全く同じように a を変更すると b も変わる
ようにもできます.

ちなみに Java の String は #1 で言われるように immutable なので, 「s1をnewしない」限り変更することはできません. 実際, String には「自分自身を変更するメソッド」がないので
s1.ほげ(ど~たらこ~たら)
という形で s1 の中身を変えることができません.

この回答への補足

回答ありがとうございます。

参照型と同じことがしたいとか、stringでJavaと同じことがしたい、というわけではありません。Stringはあくまで例です。

結局、この場合のaは何を意味するのでしょうか?自分の質問の例ではs3です。

補足日時:2011/11/02 02:50
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2011/11/02 02:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!