暇いからコピーコンストラクタとか視てみた

なんつーか、前回と同じくブログ未満なんだけど、書いてみる。
無いネタが枯れてきてるからね。
こいつを視てくれ。どう思う?

#ifndef testcopyc_Foo_hxx
#define testcopyc_Foo_hxx

#include <iostream>

class Foo;
std::ostream& operator <<(std::ostream& output, const Foo& other);


class Foo {
 public:
    Foo() {
        std::cout << "Foo#Foo() 0x" << this << std::endl;
    }
    Foo(const Foo& other) {
        std::cout << "Foo#Foo( " << other << " ) 0x" << this << std::endl;
    }


    ~Foo() {
        std::cout << "Foo#~Foo() 0x" << this << std::endl;
    }

 public:
    Foo& operator = (const Foo& other) {
        std::cout << "Foo#operator 0x" << this << " = " << other << std::endl; 
        return *this;
    }


    Foo& operator *=(const Foo& other) {
        std::cout << "Foo#operator 0x" << this << " *= " << other << std::endl; 

        return *this;
    }
};


Foo operator * (const Foo& left, const Foo& right) {
    std::cout << "Foo#operator 0x" << left << " * " << right << std::endl; 

    return Foo(left) *= right;
}


std::ostream& operator <<(std::ostream& output, const Foo& other) {
    output << "#<Foo:0x" << &other << ">" ;

    return output;
}


#endif  /* testcopyc_Foo_hxx */

す、すごく意味がないです…。
大丈夫。コピーコンストラクタがどう動くかを視るだけだから。
で、main() の方。

#include "Foo.hxx"

int main()
{
    Foo a;
    std::cout << "  - a :: " << a << std::endl << std::endl;

    std::cout << "b = a" << std::endl;
    Foo b = a;
    std::cout << "  - b :: " << b << std::endl << std::endl;

    std::cout << "c = a * b" << std::endl;
    Foo c = a * b;
    std::cout << "  - c :: " << c << std::endl << std::endl;
}

これを、コンパイルして実行してみた。

Foo#Foo() 0x0x22ff2f
  - a :: #

b = a
Foo#Foo( # ) 0x0x22ff2e
  - b :: #

c = a * b
Foo#operator 0x# * #
Foo#Foo( # ) 0x0x22feef
Foo#operator 0x0x22feef *= #
Foo#Foo( # ) 0x0x22ff2d
Foo#~Foo() 0x0x22feef
  - c :: #

Foo#~Foo() 0x0x22ff2d
Foo#~Foo() 0x0x22ff2e
Foo#~Foo() 0x0x22ff2f

ということで、ここから分かることは、b = a ってしたときに operator = じゃなくて
単にコピーコンストラクタを使ってるとかやっぱり operator * ではテンポラリ変数がデストラクタっちゃうってこと。