[ Programming ]2009. 5. 2. 03:46
// 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 반복자와 함수 객체에도 마찬가지입니다.
반복자와 함수 객체는 값으로 전달되로록 설계 해 왔기 때문.
*/

'[ Programming ]' 카테고리의 다른 글

가변인자  (0) 2009.05.13
void*  (0) 2009.05.05
opengl로 만든 배경 그림  (0) 2009.05.01
explicit  (0) 2009.04.30
팀 스위니 강연  (0) 2009.04.22
Posted by 냉동