// test.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
class CPerson
{
public:
CPerson() : m_strName("사람이름"), m_strAddress("사람주소")
{
std::cout << "CPerson - 생성자 호출" << std::endl;
}
CPerson(const CPerson& rhs)
{
this->m_strName = rhs.m_strName;
this->m_strAddress = rhs.m_strAddress;
std::cout << "CPerson - 생성자 호출" << std::endl;
}
virtual ~CPerson()
{
std::cout << "CPerson - 소멸자 호출" << std::endl;
}
protected:
std::string m_strName;
std::string m_strAddress;
};
class CStudent : public CPerson
{
public:
CStudent() : m_strSchoolName("학교이름")
{
std::cout << "CStudent - 생성자 호출" << std::endl;
}
CStudent(const CStudent& rhs)
{
this->m_strName = rhs.m_strName;
this->m_strAddress = rhs.m_strAddress;
this->m_strSchoolName = rhs.m_strSchoolName;
std::cout << "CStudent - 생성자 호출" << std::endl;
}
~CStudent()
{
std::cout << "CStudent - 소멸자 호출" << std::endl;
}
private:
std::string m_strSchoolName;
};
/// 값에 의한 전달.
bool Value_Transfer(CStudent student);
/// 참조에 의한 전달.
bool Reference_Transfer(const CStudent& student);
int _tmain(int argc, _TCHAR* argv[])
{
CStudent Student;
/// 값에 의한 전달을 할 경우
/// 함수 매개 변수는 실제 인자의 사본을 통해 초기화 된다.
/// 이들 사본을 만들어 내는 원천이 바로 복사 생성자인데, 이 점 때문에
/// 값에 의한 전달이 고비용의 연산이 되기도 합니다.
/// 복사 생성자로 인해 생성자가 실행되고, 객체의 std::string 맴버들도
/// 같이 생성됩니다. 또한 함수가 끝날때 소멸자도 호출이 됩니다.
/// 이런 생성자, 소멸자를 부르지 않는 방법은 참조에 의한 전달 방식입니다.
std::cout << "\n\n" << std::endl;
std::cout << "---------값에 의한 전달-----------" << std::endl;
Value_Transfer( Student);
std::cout << "----------------------------------" << std::endl;
std::cout << "\n\n" << std::endl;
/// 참조에 의한 전달 할 경우.
/// 참조에 의한 전달을 할 경우 생성자와 소멸자를 전혀 호출 하지 않습니다.
/// 함수인자에 const가 포함된 것을 잘 봐야 하는데요...
/// 위의 값에 의한 전달을 할 경우 복사 생상자로 생성된것을 조작?
/// 하기 때문에 원본은 변화가 없이 유지가 되는데 이와 같이 하기 위해서는
/// const를 사용하여 원본을 변형 못하게 하는 역활을 합니다.
/// 또한 값에 의한 전달이 복사손실 문제가 있을수 있지만, 참조에 의한 전달을
/// 할 경우, 복사손실이 없다는 장점도 있습니다.
std::cout << "---------참조에 의한 전달-----------" << std::endl;
Reference_Transfer(Student);
std::cout << "------------------------------------" << std::endl;
std::cout << "\n\n" << std::endl;
return 0;
}
/// 값에 의한 전잘.
bool Value_Transfer(CStudent student)
{
return true;
}
/// 참조에 의한 전달.
bool Reference_Transfer(const CStudent& student)
{
return true;
}
/*
전달하는 객체의 타입이 기본제공 타입일 경우에는 참조자로 넘기는 것보다 값으로 넘기는 편이
더 효율적일 때가 많습니다. 또한 STL 반복자와 함수 객체에도 마찬가지입니다.
반복자와 함수 객체는 값으로 전달되로록 설계 해 왔기 때문.
*/