[C++기초] 6. 객체지향 프로그래밍2

INDEX

복사생성자

깊은 복사 생성자

// 깊은 복사 생성자
ClassRecord::ClassRecord(const ClassRecord& other)
	: mCount(other.mCount)
{
	mScores = new int[mCount];
	memcpy(mScores, other.mScores, mCount*sizeof(int));
}

함수 오버로딩

연산자 오버로딩

연산자

멤버 연산자 작성법

멤버 연산자 작성법

<return-type> <class-name>::operator<operator-symbol>(<argument-list>)
{
}

Vector Vector::operator-(const Vector& rhs) const;
Vector Vector::operator*(const Vector& rhs) const;
Vector Vector::operator/(const Vector& rhs) const;

멤버 아닌 연산자 오버로딩 작성법

//header
friend <return-type> operator<operator-symbol>(<argument-list);

//cpp
<return-type> operator<operator-symbol>(<argument-list>)
{
}

friend void operator<<(std::ostream& os, const Vector& rhs);
friend Vector operator*(int scalar, const Vector* lhs);

멤버 함수를 이용한 연산자 오버로딩

Vector.h

class Vector
{
public:
	Vector operator+(const Vector& rhs) const;
private:
	int mX;
	int mY;
};

Vector.cpp

Vector Vector::operator+(const Vecotr& rhs) const
{
	Vector sum;
	sum.mX = mX + rhs.mX;
	sum.mY = mY + rhs.mY;
	return sum;
}
Vector v1(10,20);
Vector v2(3,17);
Vector Sum = v1 + v2;

멤버 아닌 함수를 이용한 연산자 오버로딩

//Vector.h
class Vector
{
	friend std::ostream& operator<<(const std::ostream& os, const Vector& rhs);
public:
	...
private:
	...
};

//Vector.cpp
std::ostream& operator<<(const std::ostream& os, const Vector& rhs)
	{
	os<<rhs.mX<<", "<<rhs.mY;
	return os;
}

//main.cpp
Vector vector(10, 20);
std::cout << vector1 << std::endl;

friend키워드

연산자 오버로딩과 const

const를 쓰는 이유

연산자 오버로딩

제한사항

연산자 오버로딩을 남용하지 말것!

이해할 수 없는 문제가 생길 수도 있다!

대입연산자

​ ** 암시적 oprator=**

암시적 함수들을 제거하는 법

클래스에 딸려오는 기본 함수들

클래스에 딸려오는 기본 함수들을 원하지 않는다면?

기본 생성자를 “지우는” 법

방법 1

//Vector.h
class Vector
{
public:
        Vector(const Vector& other);
private:
        int mX;
        int mY;
};
//main.cpp
Vector v1; // 컴파일 에러

방법2

//Vector.h
class Vector
{
private:
        Vector(){};
        int mX;
        int mY;
};
//main.cpp
Vector v1; // 컴파일 에러

암시적 복사 생성자를 “지우는”법

class Vector
{
public:
        Vector(){};
private:
        Vector(const Vector& other){};
        int mX;
        int mY;
};

암시적 소멸자를 “지우는”법

쓸 일이 있을까..?

class Vector
{
public:
private:
        ~Vector(){};
        int mX;
        int mY;
};

암시적 opertor=를 “지우는”법

class Vector
{
public:
private:
       const Vector& operator=(const Vector& rhs);
       int mX;
       int mY;
};