### 質問概要
C++ の学習をしています。
出力演算子のオーバーロードを行った時、どうやってオーバーロードされたoperator<< が呼び出されているのかわかりません。
質問詳細
以下に、クラスのヘッダファイル、クラスの実体を表す.cpp ファイル、実行用main.cpp ファイルを示します。
test.hpp
C++
1 2#ifndef DDE06408_CA21_4DBC_98E1_AF82BDCD6003 3#define DDE06408_CA21_4DBC_98E1_AF82BDCD6003 4 5#include <string> 6#include <iostream> 7 8class test 9{ 10private: 11 std::string name; 12 13public: 14 15 test(); 16 test(std::string name); 17 test &operator=(test const &); 18 std::string getName(); 19 ~test(); 20}; 21 22std::ostream &operator<<(std::ostream &os, test &obj); 23 24#endif /* DDE06408_CA21_4DBC_98E1_AF82BDCD6003 */ 25
test.cpp
C++
1#include "test.hpp" 2 3test::test(std::string name) : name(name) 4{ 5 6} 7 8 9test &test::operator=(test const & obj) 10{ 11 this->name = obj.name; 12 return (*this); 13} 14 15std::string test::getName() 16{ 17 return (name); 18} 19 20std::ostream &operator<<(std::ostream &os, test &obj) 21{ 22 os << "My name is " << test.getName() << std::endl; 23 return (os); 24} 25
main.cpp
C++
1 2#include "test.hpp" 3int main() 4{ 5 test one("TEST"); 6 test two("TEST2"); 7 8 std::cout << two; // 実行結果::My name is TEST2; 9 two.operator=(one); <- これはわかる。testクラスのメンバ関数をよびだしてるから。 10 std::cout << one; // 実行結果::My name is TEST; 11 std::cout << two; // 実行結果::My name is TEST; 12 13 14}
私が聞きたいことは、main.cpp において、std::ostream &operator<<(std::ostream &os, test &obj);
はどうやって呼び出されているのか、とう言うことです。
クラス外に定義してあるのに、演算子のオーバーロードが正しく呼び出されるのはなぜでしょう。
std::ostream &operator<<(std::ostream &os, test &obj);
が呼ばれるときは、実際はなにが起こっているのでしょうか?
two.operator=(one) <ー> two = one
の様に他の表記の仕方もあるんでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/31 10:47