0

C++ で変換コンストラクターを試すためだけに単純なクラスを作成しました。

動作しているように見えますが、特定の操作を行うと、コンパイラがそれを呼び出していないようです。理由、またはおそらくどこが間違っているかがわかります。

#include <iostream>
using std::cout; using std::endl;

class CostruttoreConversione
{
public:  
  CostruttoreConversione(int val = 0)
  {
    cout << "Costruttore chiamato" << endl;
    valore = val;
  }

  inline int getValore(){
    return valore; 
  }

  CostruttoreConversione provaConversioneImplicita()
  {
    return -10; //here the type *should* be converted; doesn't happen.
  } 

private:
  int valore;
};

int main(void){
  CostruttoreConversione obj(10);
  cout << "obj = " << obj.getValore() << endl;
  obj = 20; //WORKS 
  cout << obj.getValore() << endl;
 // cout << obj.provaConversioneImplicita() << endl; doesn't work.
  return 0;
}
4

3 に答える 3

2

構築は機能するはずですが、クラスの出力演算子を定義していないため、失敗するのは出力操作です。

あなたはまだできる

cout << obj.provaConversioneImplicita().getValore() << endl;

または、出力演算子を定義します。

inline std::ostream& operator<<(std::ostream& os, const CostruttoreConversione& cc)
{
    os << cc.getValore();
    return os;
}
于 2013-08-17T16:04:51.680 に答える
1

CostruttoreConversione が int に変換できるように、変換演算子をオーバーロードできます。

class CostruttoreConversione{
  operator int() const{
     return valore;
  }
}

コピーコンストラクタも書く

于 2013-08-17T16:06:05.533 に答える
0

既定のコンストラクターとパラメーター化されたコンストラクターは、一緒に変換コンストラクターを構成します。たとえば、ADT 配列を作成するプログラムを作成している場合、関数 main でデータ型配列の変数を宣言すると、main は、配列を開発するために使用したデータ型に配列を変換するパラメーター化されたコンストラクターを呼び出します。したがって、間接的な変換が行われています。したがって、変換コンストラクターは呼び出されません。ただし、デフォルトとパラメーター化されたコンストラクターは内部で変換を行います。

于 2013-08-17T16:06:20.397 に答える