C++에서는 C와 다르게 오버로딩이 허용된다. 다만 기존에 C에서 쓰던 함수들은 오버로딩이 당연히 안된다.
오버로딩된 함수 호출시 다음과 같은 우선순위를 가진다.
위의 단계를 거쳐도 없으면 오류 생성. 출처 : 모두의 코드
#include <iostream>
class TestClass {
private:
// 멤버 변수
int var1;
public:
// 생성자.
// C++ 11부터 디폴트 생성자를 다음과 같이 선언할수 있게 됨.
TestClass() = default;
TestClass(int var1);
// 소멸자
~TestClass();
// 멤버 함수
void setVar1(int var1);
int getVar1();
};
TestClass::TestClass() {
var1 = 42;
}
TestClass::TestClass(int var1) {
this->var1 = var1;
}
TestClass::TestClass() {
// 그냥 소멸자 보여줄라고 만들어봄..
;
}
void TestClass::setVar1(int var1) {
this->var1 = var1;
}
int TestClass::getVar1() {
return this->var1;
}
자신과 같은 클래스 타입의 인스턴스의 참조를 매개변수로 받아서, 이를 바탕으로 자기 자신을 초기화하는 생성자. 아래와 같은 형태이다.
class TestClass {
...
public:
// 복사 생성자
TestClass(const TestClass& src);
...
}
복사생성자를 호출하고자 한다면
1. TestClass test_class = TestClass(src);
2. TestClass test_class = src;
디폴트 복사 생성자
복사생성자를 만들지 않아도 컴파일러가 자동으로 복사생성자를 생성해주는데, 이를 디폴트 복사생성자라고 한다. 디폴트 복사생성자는 입력받은 인스턴스의 모든 맴버 변수의 값과 똑같이 초기화를 한다.
같은 동작 방식으로 동작할 것이다.
#include <iostream>
#include <string.h>
using std::string;
class TestClass {
public:
// 포인터 출력을 위해 일부러
int var1;
char *var2;
int get_var1(){return var1;};
void set_var1(int var1);
char * get_var2(){return var2;};
void set_var2(char *var2);
TestClass(int var1, const char *var2) {
this->var1 = var1;
this->var2 = new char[strlen(var2) + 1];
strcpy(this->var2, var2);
}
};
int main() {
string str("gyeon");
TestClass *tc = new TestClass(42, str.c_str());
// 디폴트 복사 생성자 이용
TestClass *tc2 = tc;
std::cout << tc2->get_var2() << "\t: " << tc2->get_var1() << std::endl;
std::cout << (int *)(tc->var2) << " , " << (int *)(tc2->var2) << std::endl;
return 0;
}
gyeon : 42
0xff7c08 , 0xff7c08
다음과 같은 경우 문자열의 포인터가 같은 곳을 가르킨다. 즉, 클래스 내부에 포인터가 있는 경우, 포인터의 값 까지 복사되어 delete등 시 문제가 발생할 가능성이 있다.
해결
1. 디폭트 복사 생성자 대신, 직접 복사생성자를 선언한다.
위의 포인터 문제의 경우, 포인터인 맴버변수는 동적할당후 얋은 복사
TestClass::TestClass(const TestClass& src) {
this->var1 = src.var1;
this->var2 = new char[strlen(src.var2) + 1];
strcpy(this->var2, src.var2);
...
}
C++에서는 malloc, free대신 new, delete를 사용한다.
#include <iostream>
int main() {
int
}