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++でのプリミティブの場合も含めて説明していただけると幸いです。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> 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++の環境はないですか?(勉強しているなら無いと困る気がしますが・・・。)
値そのものが入っているというのは予想外でした。値がコピーされるということは、そのクラスのもつメンバーすべてをコピーするということですか。Javaを学んだ自分からすると驚きです。
C++環境はあるのですが、実際どう結果を吐くかというより、文法的に、意味的にどういうことかが気になっていたので質問させて頂きました。ですが自分で結果を出してから質問するべきでした。
C++における参照という概念も自分が知らないものでした。C++も面白いですね。
ありがとうございました。
No.2
- 回答日時:
「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です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルVBAで教えて頂きたいのですが? 2 2022/12/31 20:28
- Excel(エクセル) 【VBAファイル移動】2つのマクロを順に実行。1つ目のマクロが実行不可⇒2つ目が実行不可となる件 2 2022/07/29 12:17
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- C言語・C++・C# char string[100]; int c, i=0; while( (c=getchar()) 2 2022/05/30 21:41
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
特定の文字列が一致する行から...
-
【Java8以降】csvファイルの複...
-
マルチスレッドで同時にFTPアッ...
-
C# JSONについて
-
C#での関数テーブルの作り方
-
C#でプロパティを使わずXMLにデ...
-
C#での関数テーブルの作り方
-
C# 他のアプリケーションから複...
-
C++/CLI 関数がインポートでき...
-
Delphiで改行文字の置換がうま...
-
string→CStringの型変換について
-
C#で型変換
-
Windows10のC++の正規表現に...
-
C言語のポインターに関する警告
-
VBAで配列の計算
-
[JAVA]try 内の変数を外で!?
-
Javaで改行などが出来ないのです。
-
javaで質問です。 文字列2023/2...
-
EXCEL VBA で、0から?1から?
-
変数を動的に利用するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C# ListBoxのアイテムをユーザ...
-
strcmp関数などでの複数の文字...
-
マルチスレッドで同時にFTPアッ...
-
C#での関数テーブルの作り方
-
特定の文字列が一致する行から...
-
string→CStringの型変換について
-
【Java8以降】csvファイルの複...
-
GDI+ DrawString() で指定範囲...
-
C#でIPアドレスの取得について
-
「指定されたキャストは有効で...
-
C# JSONについて
-
C#で型変換
-
Delphiで改行文字の置換がうま...
-
java HashMapで数値データを取...
-
GridViewで複数のDropDownList...
-
strtokでの空文字への置き換え
-
C++のmap
-
決まった拡張子のファイルだけ...
-
PHPのSHA256変換について
-
jap実行時のTomcatのエラーに困...
おすすめ情報