合計 昨日 今日

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

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: みっ
[URL]
Date: 2017年11月14日(火) 00:38
No: 1
(OFFLINE)

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

最近c++の勉強を始めました。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;は一体どのような挙動をしているのでしょうか(一行目と同じと考えていいのでしょうか)?

Name: YuO
[URL]
ハッカー(153,998 ポイント)
Date: 2017年11月14日(火) 02:07
No: 2
(OFFLINE)

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

7行目にあるような,引数が1つだけのコンストラクタは,explicitとして宣言されていない限り,暗黙の変換に使われます。
Offtopic :
なお,この「引数が1つだけのコンストラクタ」には,省略可能な引数を持っており,1個だけの引数を与えることができるようなコンストラクタを含みます。
コード[C++]: 全て選択
1
class Foo { public: Foo (int x, int y = 0); };
とか
コード[C++]: 全て選択
1
class Bar { public: Bar (int x = 0, int y = 0, int z = 0); };
とか。


今回の場合,16行目の代入においては
  • 左辺がSample型
  • 右辺がint型
であるため型が一致せず,本来は代入できないのですが,右辺をSampleクラスのコンストラクタを使った変換を行うことによって,両辺ともSample型にすることができます。
つまり,
コード[C++]: 全て選択
1
x = Sample(10);
とすることで,両辺の型が一致するため,代入が出来ます。
これを,コンパイラが自動的に行っています。
Offtopic :
もちろん,Sampleクラスにoperator = (int)があれば代入できますが,今回の話には関係しません。


なお,このユーザー定義の関数を使った暗黙の変換は1回までとなっています。
つまり,
コード[C++]: 全て選択
1
2
3
4
5
class Sample2 {
public:
    Sample2() {};
    Sample2(Sample sample){}
};
という型があっても,
コード[C++]: 全て選択
1
2
Sample2 y;
y = 10;
は2度の変換が必要になるため失敗します。


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[12人]