変換コンストラクタ
なんか少し前,
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; }
結局,これやっちゃうとコード読みにくいし,
暗黙的に変換されてることを忘れちゃう可能性もあるから,
使わないほういいっぽい.