
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
構造体のデータを丸ごとコピーしたい
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
C++ 構造体の一括初期化 {0}
C言語・C++・C#
-
-
4
char*を初期化したいのですが
C言語・C++・C#
-
5
charからLPTSTRへの変換方法
C言語・C++・C#
-
6
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
7
C++のfor文について
C言語・C++・C#
-
8
戻り値で構造体を返すことは可能でしょうか?
C言語・C++・C#
-
9
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
10
スレッドの監視方法について
C言語・C++・C#
-
11
MFC ポップアップメニューのチェック表示について
C言語・C++・C#
-
12
0除算して、落ちるプログラムと落ちないプログラム
C言語・C++・C#
-
13
C++にてtemplateで受け取った任意の型の変数が何型であるかを判定したい
C言語・C++・C#
-
14
error C2712: オブジェクト アンワインディングが...について
C言語・C++・C#
-
15
プログラムでの数字につく”f”の意味
C言語・C++・C#
-
16
構造体のextern方法
C言語・C++・C#
-
17
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
18
VC++でUTF-8のファイルを出力したい
C言語・C++・C#
-
19
画面を強制的に再描画させる方法
C言語・C++・C#
-
20
C言語での引数の省略方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DataTableに入っているデータを...
-
Eclipseのコード入力時の、行コ...
-
C++言語で、構造体のコピーは可...
-
Access VBAから使用したExcelプ...
-
Ctrl + Cなど複数の入力キー...
-
Activesheet.Pasteで困っています
-
マウントしたディスクにcpで、...
-
他プロジェクトのFormを自プロ...
-
JP1の質問です。
-
web page の表を word に貼り...
-
文字列の切り出し
-
テーブルのコピーについて
-
エクセルVBA 実行時エラー'...
-
一行おきに貼り付ける 可能でし...
-
エクセルのマクロについて教え...
-
excel vba シートがなければコ...
-
CStringArray[2]のコピー
-
Listviewに表示された文字のコ...
-
コピーした文章が改行がされて...
-
Excelでコピーしたセル(テキス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
C++言語で、構造体のコピーは可...
-
マウントしたディスクにcpで、...
-
Ctrl + Cなど複数の入力キー...
-
Eclipseのコード入力時の、行コ...
-
DataTableに入っているデータを...
-
Activesheet.Pasteで困っています
-
Listviewに表示された文字のコ...
-
一行おきに貼り付ける 可能でし...
-
arduino unoからデータを読み出...
-
【UWSC】WEBページ内コピーした...
-
jakarta poiを使用し、EXCELの...
-
文字列の切り出し
-
Debug版とRelease版で結果が変わる
-
シートに張り付けたボタンがシ...
-
Excelでコピーしたセル(テキス...
-
バッチで当日日付で作成される...
-
VBScript でサブフォルダも含め...
-
エクセルVBA 実行時エラー'...
-
CStringArray[2]のコピー
おすすめ情報