![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.3ベストアンサー
- 回答日時:
「C++」では何の問題もありません.
「C」だと, ふる~い時代の遺跡級のコンパイラが文句を言うかもしれません. ま, その手の遺跡級のコンパイラだと
・void がない (void * は char * で代用する)
・プロトタイプが存在しない
・const や volatile がない
・ひょっとすると単項の + もない
など, 今の視点からするといいたいことは山ほどあります (さすがに a -= b; ではなく a =- b; とするコンパイラを使うことはないだろう).
そのような時代には構造体のコピーを memcpy でやっていましたが, C++ では逆に危険です.
No.7
- 回答日時:
基本的には問題ありません。
しかし、構造体のコピーには時間が掛かります。
yontosuさんの言う例のような、たかだかchar namae[10]程度の小さな配列であれば問題ありませんが、例えばchar namae[100000]のような巨大な配列であればそれなりに時間が掛かります。
「そんなデカい配列を作る訳が無い。」
そう思うかもしれません。
でも例えばこう言った例はどうですか?
typedef struct seito {
char namae[10];
char gakkou[50];
char juusyo[100];
int ten;
}Seito;
typedef struct kurasu {
Seito seito[50];
}Kurasu;
typedef struct gakunen {
Kurasu kurasu[10];
}Gakunen;
こんなような構造体を作ったとしたら、この構造体の「Gakunen」中にはchar配列が80000個分あります。
これを丸々コピーしようとしたら・・・それなりに時間が掛かりますよね・・・?
・・・と言っても、最近のコンピュータはかなり高速なので、実はchar配列80000個程度ではびくともしません。
ただし。for文とかで、例えば生徒の数分、80000回繰り返すとしたら・・・80000×80000=6400000000と言うゼロが何個あるのかと言う相当な数値です。
更にfor文の入れ子でこれを1000回ループしたら・・・ここまで巨大な数値になってくると流石に最近のコンピュータでも結構な時間が掛かります。
学校で習うような小さなプログラムであれば大した問題にはなりませんが、
実際の業務で使うようなプログラムではこういう巨大な構造体は平気でありますし、
それを(入れ子の入れ子の入れ子の・・・で)1000000回ループなんて言う事もザラです。
将来IT系の仕事に就こうと思っているなら、今のうちに配列のコピーは使わず、
ポインタ等を使う手法に慣れておいた方がいいです。
No.6
- 回答日時:
C++においてstructをどのように使うべきかについて、以下の記述がありますので、参考にして下さい。
「
...The only difference is that with the 'struct' keyword, all members are public by default.
Nevertheless, I would recommend using 'class' and 'struct' in a way that helps clarify the semantics.
That is, 'class' should be used when we define objects that have data members and member functions with different access levels, while 'struct' should be used if we only need a data structure ( a composition of values ) with public access to all data.
...
Unfortunately, the semantic difference between 'class' and 'struct' is not made in much of the literature.
」
Nicolai M. Josuttis「Object-Oriented Programming in C++」(p.132)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_04.png?e8efa67)
No.5
- 回答日時:
#3 の方も指摘されていますが、基本的に質問にあるようなコピーや
a = b みたいな代入ならば問題ありません。
memcpy()のような直接メモリをコピーするような場合におかしくなります。
ただ、mem*()を利用する場合でも、純粋な構造体(Cでも利用できる構造体)ならば、問題はないようです。
この辺、個人的にはC++の仕様バグ(あるいは欠陥)なんじゃないかとも考えているのですが
C++の場合、構造体もクラスとして扱われるので
メンバー関数の追加や継承とかもできてしまうのです。
その関係かしら、構造としてメンバーにも見えない部分があって
たとえば、memset(&a, 0 sizeof(a) )とかしたひにはきっとcoreはきます。
memcpy()ならば問題ないかもしれませんけど、クラスみたいな使い方をしている場合はやめておいた方が吉かもしれません。
No.4
- 回答日時:
> C++言語で、構造体のコピーは可能(しても良い)のでしょうか?
普通は可能です。
ただし、できない場合もあります。
具体的には、次のようなケースです。
struct A
{
int a;
private:
A(const A&);
A& operator=(const A&);
};
明示的にコピーが禁止されていますので、コピーコンストラクタやコピー代入演算子を呼び出そうとすると、コンパイルエラーになります。
このような型のメンバを持つ構造体も同様です。
また、std::auto_ptrのような破壊的セマンティクスを持つメンバを持つ場合も、コピー代入演算子は使えても、コピーにはなりません。
No.2
- 回答日時:
昨今ではまず問題ないです。
あえて上げれば、C言語の標準仕様が策定される以前、
そういったコピーができなかった時代があるので、
ふるーい遺物の場合くらいでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# プログラムが書けません。 4 2023/01/22 22:57
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 哲学 非構造主義 1 2023/04/06 16:02
- 日本語 日本語のアクセント 1 2022/05/12 13:26
- 英語 提示した結果構文が非文となる理由について 1 2022/07/25 12:22
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
構造体のデータを丸ごとコピーしたい
C言語・C++・C#
-
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
構造体のメンバをfor文で回したい
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
charからLPTSTRへの変換方法
C言語・C++・C#
-
6
C言語での引数の省略方法
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
構文エラー;"が型の前にありませんとは、どうしたら解決できるのですか。"
C言語・C++・C#
-
9
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
10
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
11
C++における継続行
その他(プログラミング・Web制作)
-
12
C++のfor文について
C言語・C++・C#
-
13
異なる構造体のデータのコピー
C言語・C++・C#
-
14
error C3867 関数呼び出しには引数リスト
C言語・C++・C#
-
15
ファイル書込みで一行もしくは部分的に上書きする
PHP
-
16
CString から LPCTSTRの型に変換
C言語・C++・C#
-
17
関数から配列を返すには?
C言語・C++・C#
-
18
WaitForSingleObjectの使い方について
C言語・C++・C#
-
19
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
20
ファイル内のデータを1行削除する方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++言語で、構造体のコピーは可...
-
Access VBAから使用したExcelプ...
-
単体で実行できるEXEを作る。BCB
-
エクセルVBA 実行時エラー'...
-
マウントしたディスクにcpで、...
-
arduino unoからデータを読み出...
-
一行おきに貼り付ける 可能でし...
-
Ctrl + Cなど複数の入力キー...
-
JP1の質問です。
-
パスワードのコピー&ペースト...
-
Activesheet.Pasteで困っています
-
Subversionで作業一段落の作業...
-
文字列の切り出し
-
DataTableに入っているデータを...
-
ブラウザからコピペすると文字...
-
複数のExcelファイルにある同名...
-
FTPのgetとputの使いわけ。
-
iCloud for Windowsをアンイン...
-
CSVファイルの特定行の削除
-
ファイルが移動してもリンクの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++言語で、構造体のコピーは可...
-
Access VBAから使用したExcelプ...
-
マウントしたディスクにcpで、...
-
一行おきに貼り付ける 可能でし...
-
Activesheet.Pasteで困っています
-
Listviewに表示された文字のコ...
-
エクセルVBA 実行時エラー'...
-
DataTableに入っているデータを...
-
Eclipseのコード入力時の、行コ...
-
Ctrl + Cなど複数の入力キー...
-
文字列の切り出し
-
arduino unoからデータを読み出...
-
バッチで当日日付で作成される...
-
jakarta poiを使用し、EXCELの...
-
シートに張り付けたボタンがシ...
-
【UWSC】WEBページ内コピーした...
-
Eclipseでコピーするとき行数な...
-
エクセルのマクロについて教え...
-
Excelでコピーしたセル(テキス...
-
OutlookVBAでコピーした文字を...
おすすめ情報