オブジェクトへの代入について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
みっ

オブジェクトへの代入について

#1

投稿記事 by みっ » 6年前

最近c++の勉強を始めました。

コード:

#include <iostream>
using namespace std;
class Sample {
private: 
	int a;
public:
	Sample(int i) {a = i;}
	int Get_a() {
		return a;
	}
};

int main() {
	Sample x(20);
	cout << x.Get_a() << "\n";
	x = 10;
	cout << x.Get_a() << "\n";
	return 0;	
}
単純なプログラムなのですが、main二行目のコードでは20、四行目のコードでは10と表示されます。
main一行目のオブジェクトを生成してコンストラクタに20を引数として与えるのは理解できるのですが、main三行目のx = 10;は一体どのような挙動をしているのでしょうか(一行目と同じと考えていいのでしょうか)?

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: オブジェクトへの代入について

#2

投稿記事 by YuO » 6年前

7行目にあるような,引数が1つだけのコンストラクタは,explicitとして宣言されていない限り,暗黙の変換に使われます。
オフトピック
なお,この「引数が1つだけのコンストラクタ」には,省略可能な引数を持っており,1個だけの引数を与えることができるようなコンストラクタを含みます。

コード:

class Foo { public: Foo (int x, int y = 0); };
とか

コード:

class Bar { public: Bar (int x = 0, int y = 0, int z = 0); };
とか。
今回の場合,16行目の代入においては
  • 左辺がSample型
  • 右辺がint型
であるため型が一致せず,本来は代入できないのですが,右辺をSampleクラスのコンストラクタを使った変換を行うことによって,両辺ともSample型にすることができます。
つまり,

コード:

x = Sample(10);
とすることで,両辺の型が一致するため,代入が出来ます。
これを,コンパイラが自動的に行っています。
オフトピック
もちろん,Sampleクラスにoperator = (int)があれば代入できますが,今回の話には関係しません。
なお,このユーザー定義の関数を使った暗黙の変換は1回までとなっています。
つまり,

コード:

class Sample2 {
public:
    Sample2() {};
    Sample2(Sample sample){}
};
という型があっても,

コード:

Sample2 y;
y = 10;
は2度の変換が必要になるため失敗します。

返信

“C言語何でも質問掲示板” へ戻る