C++におけるオブジェクトの値渡し・値戻し

1.オブジェクトの値渡し

関数の引数にオブジェクトを値渡しすると、オブジェクトのコピーの際にコピーコンストラクタが呼び出され、関数を抜ける時にディストラクタが呼び出されます。

passA.cpp

#include <iostream>

class A {
public:
  A() {
    std::cout << "Constructor!" << std::endl;
  }
  A(const A& object) {
    std::cout << "Copy Constructor!" << std::endl;
  }
  ~A() {
    std::cout << "Destructor!" << std::endl;
  }
};

void passA(A a) {
  std::cout << "Pass A!" << std::endl;
}

int main() {
  auto a = A();
  passA(a);
}

〈実行結果〉

Constructor!
Copy Constructor!
Pass A!
Destructor!
Destructor!


2.オブジェクトの値戻し

オブジェクトが値戻しされる時も、最後にディストラクタが呼び出されます。

returnA.cpp

#include <iostream>

class A {
public:
  A() {
    std::cout << "Constructor!" << std::endl;
  }
  A(const A& object) {
    std::cout << "Copy Constructor!" << std::endl;
  }
  ~A() {
    std::cout << "Destructor!" << std::endl;
  }
};

A returnA() {
  std::cout << "Return A!" << std::endl;
  return A();
}

int main() {
  returnA();
}

〈実行結果〉

Return A!
Constructor!
Destructor!


参考サイト

1.C++ クラス設計に関するノート
2.関数とオブジェクト
3.オブジェクト利用時の注意点
4.参照の復習とコピーコンストラクタ
5.コピーコンストラクタ、代入演算子、デストラクタ(The Law of the Big Three)
6.コピー

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中