開発環境
- OS X Mavericks - Apple, ときどきWindows 8.1 + Cygwin64, MinGW (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C++ (プログラミング言語)
- g++(コンパイラ)
C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の18章(演算子のオーバーロード)、設問 18-1.を解いてみる。
その他参考書籍
- C++プログラミング入門 (グレゴリー サティア (著)、ダウグ ブラウン (著)、Gregory Satir (原著)、Doug Brown (原著)、望月 康司 (翻訳)、谷口 功 (翻訳)、オライリージャパン)
設問 18-1.
コード(BBEdit, Emacs)
equal.cpp
#include <iostream> class trouble { public: int data; trouble(); // コピーコンストラクタ trouble(const trouble& old); // 代入演算子のオーバーロード // 問題のコードでは引数の部分に&がない trouble operator = (const trouble& old_trouble); }; // コンストラクタ trouble::trouble() { data = 0; } // コピーコンストラクタ // 代入演算子(以下のoperator =)を呼び出している trouble::trouble(const trouble& old) { std::cout << "Copy constructor called\n"; *this = old; } // 代入演算子のオーバーロード // 問題のコードでは引数の部分に&がない trouble trouble::operator = (const trouble& old_trouble) { std::cout << "operator = called\n"; data = old_trouble.data; return (*this); } int main(int argc, char *argv[]) { trouble trouble1; // コピーコンストラクタを呼び出す trouble trouble2(trouble1); // コピーコンストラクタを呼び出すと、代入演算子(operator =)が呼び出される // 問題のコードでは&が無いので、値渡しで引数trouble1が渡される(コピーが渡される) // すると、trouble1をコピーするのに、コピーコンストラクタが呼び出される // 無限循環 return (0); }
Makefile
# # FSFのg++コンパイラ用のMakefile # CC=g++ CFLAGS=-g -Wall all: equal equal: equal.cpp ${CC} ${CFLAGS} -o equal equal.cpp clean: rm equal
入出力結果(Terminal)
$ make && ./equal g++ -g -Wall -o equal equal.cpp Copy constructor called operator = called Copy constructor called operator = called …省略 Copy constructor called operator C-c C-c $
Copy constructor calledは循環しなくなったけど、operator = calledでまた無限ループに。ということでもう少し修正してみることに。
コード(BBEdit, Emacs)
equal.cpp
#include <iostream> class trouble { public: int data; trouble(); trouble(const trouble& old); // 問題のコードには、戻り値に&がない。 trouble& operator = (const trouble& old_trouble); }; // コンストラクタ trouble::trouble() { data = 0; } // コピーコンストラクタ trouble::trouble(const trouble& old) { std::cout << "Copy constructor called\n"; *this = old; } // 代入演算子のオーバーロード // 問題のコードには、戻り値に&がないので、戻り値を返すのに、 // (*this)のコピーを作成して、それを返す。つまり、コピーコンストラクタ // が呼び出される。 // そして、コピーコンストラクタが呼び出される。なので無限ループになる trouble& trouble::operator = (const trouble& old_trouble) { std::cout << "operator = called\n"; data = old_trouble.data; return (*this); } int main(int argc, char *argv[]) { trouble trouble1; trouble trouble2(trouble1); return (0); }
入出力結果(Terminal)
$ make && ./equal g++ -g -Wall -o equal equal.cpp Copy constructor called operator = called $
0 コメント:
コメントを投稿