
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)

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#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
C++のfor文について
C言語・C++・C#
-
6
charからLPTSTRへの変換方法
C言語・C++・C#
-
7
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
8
スレッドの監視方法について
C言語・C++・C#
-
9
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
10
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
11
MFC ポップアップメニューのチェック表示について
C言語・C++・C#
-
12
構造体のextern方法
C言語・C++・C#
-
13
画面を強制的に再描画させる方法
C言語・C++・C#
-
14
構造体のメンバをfor文で回したい
C言語・C++・C#
-
15
エディットボックスのフォントを変えたい
C言語・C++・C#
-
16
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
17
MFCアプリケーションでの終了コードの指定方法
C言語・C++・C#
-
18
void*型のデータサイズ
C言語・C++・C#
-
19
既定のコンストラクタがない?
C言語・C++・C#
-
20
error C2712: オブジェクト アンワインディングが...について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
Eclipseのコード入力時の、行コ...
-
jakarta poiを使用し、EXCELの...
-
Listviewに表示された文字のコ...
-
マウントしたディスクにcpで、...
-
Excelでコピーしたセル(テキス...
-
DataTableに入っているデータを...
-
C++言語で、構造体のコピーは可...
-
Ctrl + Cなど複数の入力キー...
-
Eclipseでコピーするとき行数な...
-
.BATでクリップボードに複数の...
-
インプットボックスで選択した...
-
エクセルVBA 実行時エラー'...
-
VBScript でサブフォルダも含め...
-
文字列の切り出し
-
Delphi6 ShowMessage のタイトル
-
Excel: ファイル名になぜ、[...
-
エクセルのファイル:「自分」が...
-
svnでファイル移動すると履歴が...
-
「セキュリティの警告 発行元...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
DataTableに入っているデータを...
-
Eclipseのコード入力時の、行コ...
-
C++言語で、構造体のコピーは可...
-
Ctrl + Cなど複数の入力キー...
-
一行おきに貼り付ける 可能でし...
-
マウントしたディスクにcpで、...
-
Activesheet.Pasteで困っています
-
文字列の切り出し
-
jakarta poiを使用し、EXCELの...
-
Listviewに表示された文字のコ...
-
【UWSC】WEBページ内コピーした...
-
他プロジェクトのFormを自プロ...
-
Excelでコピーしたセル(テキス...
-
エクセルVBA 実行時エラー'...
-
VBScript でサブフォルダも含め...
-
シートに張り付けたボタンがシ...
-
Eclipseでコピーするとき行数な...
-
【再質問】Eclipseのコード入力...
-
バッチで当日日付で作成される...
おすすめ情報