読者です 読者をやめる 読者になる 読者になる

変換コンストラクタ

なんか少し前,

  StrType st = new char[10];

とかやったらコンパイルが通ってしまった.
「StrType型なのにchar型が入るっておかしくね??」
id:Silent-Bob が言っていたが,たしかにそのとおり.

でも,C++には暗黙的に変換してくれる仕組みがじつはあった...

変換関数を自動的に生成してるからこれが通るらしい.
変換コンストラクタともいう.

#include <iostream>
#include <cstdlib>
using namespace std;

class MyClass{
  int a;
 public:
  MyClass(int x){
    a = x;
  }
  MyClass(const char* str){
    a = atoi(str);
  }
  int getA(){
    return a;
  }
};

int main(){
  // 自動的にコンパイラが変換関数を生成する
  // ob1(829) に変換される.
  MyClass ob1 = 829;
  // ob1("839") に変換される.
  MyClass ob2 = "839";

  cout << ob1.getA() << endl;
  cout << ob2.getA() << endl;

  cout << "--------------------------" << endl;

  // こういう時も変換される.
  ob1 = 1024;
  ob2 = "2048";
  cout << ob1.getA() << endl;
  cout << ob2.getA() << endl;

  return 0;
}

この自動変換を無効にしたい場合は,コンストラクタにexplicitをつける.

explicit MyClass(const char* str){...}

あと,練習問題にmyclass(int)だけをexplicitとした場合,myclass(char*)によって暗黙的な変換が行われるかどうかってのがあるんだけど,
コンパイルエラーで通らなかった.
でも,答えにはできます.って書いてあった...

#include <iostream>
#include <cstdlib>
using namespace std;

class MyClass{
  int a;
 public:
  // ここだけ
  explicit MyClass(int x){
    a = x;
  }
  MyClass(const char* str){
    a = atoi(str);
  }
  int getA(){
    return a;
  }
};

int main(){
  // 自動的にコンパイラが変換関数を生成する
  // ob1(829) に変換される.
  MyClass ob1 = 829;
  // ob1("839") に変換される.
  MyClass ob2 = "839";

  cout << ob1.getA() << endl;
  cout << ob2.getA() << endl;

  cout << "--------------------------" << endl;

  // こういう時も変換される.
  ob1 = 1024;
  ob2 = "2048";
  cout << ob1.getA() << endl;
  cout << ob2.getA() << endl;

  return 0;
}


結局,これやっちゃうとコード読みにくいし,
暗黙的に変換されてることを忘れちゃう可能性もあるから,
使わないほういいっぽい.