
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
C++のfor文について
C言語・C++・C#
-
5
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
6
構造体のメンバをfor文で回したい
C言語・C++・C#
-
7
スレッドの監視方法について
C言語・C++・C#
-
8
char*を初期化したいのですが
C言語・C++・C#
-
9
MFC ポップアップメニューのチェック表示について
C言語・C++・C#
-
10
error C2712: オブジェクト アンワインディングが...について
C言語・C++・C#
-
11
多重定義が起きている?--lnk2005エラー:VC++
C言語・C++・C#
-
12
CString から LPCTSTRの型に変換
C言語・C++・C#
-
13
svnでファイル移動すると履歴がついてこない
その他(コンピューター・テクノロジー)
-
14
C言語で、メモリを解放しないで終わるプログラム
C言語・C++・C#
-
15
ダイアログ表示時にチェックボックスにチェックされている状態にするには?
C言語・C++・C#
-
16
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
17
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
18
コンボボックスでデフォルト値の設定
C言語・C++・C#
-
19
エディットボックスのフォントを変えたい
C言語・C++・C#
-
20
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Replace関数について教えて...
-
CSSが全く分かりません、お助け...
-
DLLファイルの逆コンパイラにつ...
-
バッチファイルで以下のような...
-
CPUが16bitでも32bitOSでコンパ...
-
gccを行ってもexeファイルが生...
-
c言語
-
VisualStudio2022でC言語プログ...
-
Windows Formアプリからコンソ...
-
visual studio 2022でのC#プロ...
-
C言語の関数のextern宣言
-
プログラマー達は何故、プログ...
-
PIC12F1822でLED調光器を作りたい
-
最初に聞かれたこと
-
C言語 関数、変数の宣言について
-
C言語について(初心者)
-
プログラミングc++を全く分か...
-
あってる
-
DNCL(共テ用プログラミング言語...
-
DNCL(共テ用プログラミング言語...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access VBAから使用したExcelプ...
-
マウントしたディスクにcpで、...
-
一行おきに貼り付ける 可能でし...
-
C++言語で、構造体のコピーは可...
-
Activesheet.Pasteで困っています
-
Eclipseのコード入力時の、行コ...
-
Ctrl + Cなど複数の入力キー...
-
DataTableに入っているデータを...
-
Listviewに表示された文字のコ...
-
jakarta poiを使用し、EXCELの...
-
文字列の切り出し
-
Eclipseでコピーするとき行数な...
-
コピーした文章が改行がされて...
-
他プロジェクトのFormを自プロ...
-
Excelでコピーしたセル(テキス...
-
プログラムについて。
-
【UWSC】WEBページ内コピーした...
-
バッチで当日日付で作成される...
-
ASP.net でコントロールをコピー
-
arduino unoからデータを読み出...
おすすめ情報