• ベストアンサー

コピーコンストラクタ

コピーコンストラクタについて何か面白いネタがあったら教えてください

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

 こんばんは。  面白いかどうかは不明ですが、コピーコンストラクタと代入演算子をテンプレート化してLHS >= RHSでなければコンパイルエラーにするとか。  VC60では無理です、VC2005が無いと。 //ココでエラー template<bool __size_ok> struct size_check; //LHS >= RHSなのでOK template<> struct size_check<true> { }; //代入させる template<class __Tp, class __Tp2> struct static_assert { //サイズの計測 typedef typename size_check<sizeof(__Tp) >= sizeof(__Tp2)> result; }; //bool型に他の型は代入させない ココでエラー template<class __Tp2> struct static_assert<bool, __Tp2>; template<class __Tp> struct bogus { typedef typename __Tp value_type; explicit bogus(const __Tp& r = __Tp(0)) : _M_tp(r){ } template<class __Tp2> bogus(const bogus<__Tp2>& r) : _M_tp(r.get()) { static_assert<value_type, bogus<__Tp2>::value_type>::result(); } template<class __Tp2> bogus& operator = (const bogus<__Tp2>& r) { new (this) bogus<__Tp2>(r); return *this; } bogus(const bogus<__Tp>& r) : _M_tp(r._M_tp){ } bogus& operator = (const bogus& r) { if(this != &r)new (this) bogus(r); return *this; } ~bogus(){ } __Tp get() const { return _M_tp; } private: __Tp _M_tp; }; int main() { bogus<char> Char(10); bogus<bool> Bool = Char;//ERROR bogus<bool> Bool2; bogus<bool> Bool3 = Bool2;//OK bogus<int> Int = Bool3;//OK bogus<long> Long = Int;//OK bogus<short> Short = Long;//ERROR return 0; }

koller2008
質問者

お礼

わざわざプログラムを書いてくれてありがとうございます。 これはプレゼンのいいネタになりそうです。 参考にさせてもらいます

その他の回答 (2)

  • min_is
  • ベストアンサー率25% (1/4)
回答No.3

当たり前すぎて面白くないかもしれませんが、デストラクタでメンバー 変数をdeleteするよなクラスの場合、コピーコンストラクタで、 うまく対処しないと、2重delete してしまうかもしれません。 #include <cstdlib> #include <cstring> #include <iostream> using namespace std; class CLS{ public: CLS(char * msg){ int msglen= strlen(msg); str = new char[msglen+1]; memcpy(str,msg,msglen+1); } ~CLS(){ cout << "~CLS" << endl; delete str; } void print(){ cout << "print:" << str<< endl; } private: char * str; }; void foo(CLS s){ s.print(); } void bar(){ CLS s("msg"); s.print(); foo(s); // fooから戻るときにs.strはdeleteされてしまう s.print(); } int main(int argc,char * argv[]) { bar(); } このほかにも、メンバーにポインターがある場合とか、コピー代入演算子 がある場合とか、いろんな時にコピーコンストラクタがほしくなります。 関数引数を参照渡しにするとある程度は回避できますが、例外クラス、 演算子オーバーロードの戻り値にする場合や、コンテナに値を格納する 場合などには、欲しくなると思います。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「面白い」かどうかの判定基準を教えてください.

関連するQ&A

専門家に質問してみよう