- ベストアンサー
コピーコンストラクタと、代入オペレータについて
コピーコンストラクタと、代入オペレータについてわかりやすく教えてください。 本を読んでもなんだかよくわかりません。 例があるとうれしいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (2)
- blue_murder
- ベストアンサー率34% (54/157)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
関連するQ&A
- コピーコンストラクタが呼び出されていない?
コピーコンストラクタが呼び出されていない? class myclass { public: int x; myclass(const int& init_); //コンストラクタ myclass(const myclass& init_); //コピーコンストラクタ const myclass operator+(const myclass& rhs); //加算 const myclass& operator=(const myclass& rhs); //代入 }; と定義したクラスを使ってオブジェクトを生成するときに妙な挙動をしています。 myclass mc1(10); myclass mc2 = 20; myclass mc3(mc1 + mc2); //コピーコンストラクタが呼ばれるはず このコードを実行した結果は、mc3(mc1+mc2)では自分で定義したコピーコンストラクタは実行されませんでした。 mc3(mc1 = mc2)と実行すれば、コピーコンストラクタが実行されたのですが、この違いはどこにあるのでしょうか。 そもそも、myclassとmyclass&は全く別のものなのでしょうか?
- ベストアンサー
- C・C++・C#
- コピー代入演算子と代入演算子は同じ意味なんですか?
コピー代入演算子(copy substitution operator)は代入演算子( substitution operator)同じ意味なんですか?
- ベストアンサー
- C・C++・C#
- クラス中でコンストラクタを使わず変数に代入をする理由は?
JAVAやJavascript、最近オブジェクト指向的な記述が可能になったphpなどの言語で次のようなクラス定義が可能です。 <JAVAの場合> class A { public int i1 = 1; public int i2; A() { i2 = 2; } } しかし最近覚えたC++では、例の「public int i1 = 1;」のようなクラスのスコープ内で代入を行うことは出来ず、その場所では「public int i2;」のように宣言のみ、代入はコンストラクタで行うようになっています。この場合はなぜ「public int i1 = 1;」はダメなのかと疑問に思っても「そういう仕様だ」と言われれば納得できます(やり方が1つだけなので)。 ではJAVAなどの言語で、例のような場所で「public int i1 = 1;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?
- 締切済み
- Java
- コンストラクタって?
↓ ↓ ↓ クラスを基にインスタンス化を行いますが このときに初期化を行わなくてはならないことがあります。 それを実現するのが「コンストラクタ」です。 のような解説はたくさん読んできたのですが 具体的にどういう場合にコンストラクタを使用するのでしょうか? プログラムには必ずコンストラクタは必要なんですか? 例えばシューティングゲームを作るときの こういう処理にコンストラクタが役立つんだよー! などという具体的な例があればぜひ教えてください。 どなたかご協力よろしくお願いします!
- ベストアンサー
- Java
- 初期化リストとコンストラクタでの代入について
class AAA { int a; AAA():a(10) {} }; class AAA { int a; AAA(){a=10;} }; 上記のようにコンストラクタで初期化を行う場合、 初期化リストを使用するのと代入を使用するのでは、 速度の面からいえば優劣はあるのでしょうか? VC++などでは最適化されどちらも同じバイナリが 生成されるということですが、これは本当でしょうか? 参考書籍名などもおしえていただければ助かります。 よろしくお願いいたします。
- ベストアンサー
- C・C++・C#
- コンストラクタ・デストラクタ
プログラミング言語はC++ C++を触り始めたばかりの素人です。 コンストラクタとデストラクタについて質問です。 下記に参考にしているウェブページから簡潔にしてコードを書いてみました。 コンストラクタ、デストラクタの中はそれぞれに、○○が呼び出されましたと書いてあるだけでよく分からなかったので別のウェブページを見たら コンストラクタは Sample::Sample(){ n=0; } みたいな例があったのですが、このように変数に予め何かの値を代入しておくという事で合ってますか? デストラクタは理解できていません。 下記の例では、どのような処理を書けばいいのでしょうか? #include<iostream> using namespace std; class Sample { private: int n; public: void Show(); Sample(); ~Sample(); }; void Sample::Show() { cout << n << endl; } Sample::Sample() { // n=0; std::cout << "コンストラクタが呼び出されました" << std::endl; } Sample::~Sample() { // どんな処理? std::cout << "デストラクタが呼び出されました" << endl; } main() { Sample sample; sample.Show(); return 0; } 実行結果 コンストラクタが呼び出されました 1 ←コンストラクタ関数内の//を削除で0になることは確認 デストラクタが呼び出されました
- ベストアンサー
- C・C++・C#
- operator代入演算子のやり方で疑問が
C++の勉強をしています。 そこでoperatorを使うことをやっているんですが、この演算子、引数を二つつけるとエラーになります。クラス内で定義するとこうなります。 ですがグローバルで定義するとエラーが出力されません。 何故なんでしょうか? 戻り値の関係でしょうか? class Complex { public: Complex() { } public: // これはエラー、この演算子関数のパラメータが多すぎますと出力される const Complex operator+(const Complex x, const Complex y) { } }; // これはでない・・・ const Complex operator+(const Complex x, const Complex y) { } 上記のプログラムだと、下に書いてある代入演算子は問題ありません。 なぜこうなるんでしょうか? ご教授お願いします。
- ベストアンサー
- C・C++・C#
- コンストラクタ
恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{ Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?
- ベストアンサー
- Java
- デフォルトコンストラクタで分からないことがあります。
デフォルトコンストラクタ デフォルトコンストラクタで分からないことがあります。 以下のコードです。 > template<class T1, class T2> > struct pair > { > T1 first; // 1つ目の値 > T2 second; // 2つ目の値 > > // デフォルトコンストラクタ > pair() : first( T1() ), second( T2() ){} > > // 引数付きコンストラクタ > pair(const T1& a, const T2& b) : first( a ), second( b ){} > }; このコードの中の pair() : first( T1() ), second( T2() ){} で初期化子による初期化をしていると思うのですが「T1()」と「T2()」は具体的に 何をしているのでしょうか?自分の想像ではfirstとsecondに何か初期化の値を代入して初期化していると思うのですが何でしょうか? なお、その次のコードの意味は分かります。 > pair(const T1& a, const T2& b) : first( a ), second( b ){} これは、引数a,bを持っていてそれぞれfirstにaを代入してsecondにbを代入して初期化しているのですよね。 なお、このコードが掲載されているサイトはここです。 http://www.geocities.jp/ky_webid/cpp/library/011.html
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます。 処理はなんとなくわかるのですが、外部参照は未解決です。 とか出て、コンパイルができませんでした。(VC++6.0 コンソールアプリです。)