멤버 함수 : 클래스의 일부로 정의된 함수로, 멤버 함수는 해당 클래스의 객체가 가지고 있는 데이터(멤버 변수)에 접근하고, 이를 조작할 수 있는 기능을 제공한다.
class Dog {
public:
void bark() {
std::cout << "Woof!" << std::endl;
}
};
위와 같은 간단한 클래스가 있을 bark()함수는 Dog 클래스의 멤버 함수이다.
생성자의 경우, 생성자가 만들어져있지 않다 하더라도 컴파일러가 알아서 생성자가 만들어졌다고 판단하여 자동적으로 처리하는 기능이 있는데 이렇게 만들지 않았을 때도 컴파일러가 자동 생성하는, 그래서 어떤 클래스건 일단 있다고 가정하게 되는 함수들을 "암시적 멤버 함수(메소드)"라고 칭한다.
암시적 멤버함수에는 기본 생성자, 소멸자, 복사 생성자, 이동 생성자 등이 있다.
기본 생성자
class MyClass {
public:
int value;
};
int main()
{
MyClass obj; // 기본 생성자가 호출됨
}
기본 생성자는 매개변수가 없는 생성자로, 객체가 생성될 때 자동으로 호출된다. 사용자가 정의하지 않으면 컴파일러가 자동으로 생성합니다.
복사 생성자
class MyClass {
public:
int value;
// 사용자 정의 생성자
MyClass(int v) : value(v) {
std::cout << "사용자 정의 생성자 호출: " << value << std::endl;
}
// 복사 생성자
MyClass(const MyClass& other) : value(other.value) {
std::cout << "복사 생성자 호출: " << value << std::endl;
}
};
int main() {
MyClass obj1(10); // 사용자 정의 생성자 호출
MyClass obj2 = obj1; // 복사 생성자가 호출됨
return 0;
}
복사 생성자는 같은 클래스의 다른 객체를 사용하여 새로운 객체를 생성할 때 호출된다. 매개변수로 const 참조를 사용하여 객체를 전달한다.
MyClass(int v) : value(v) {}는 사용자 정의 생성자로, 객체가 생성될 때 value 멤버 변수를 초기화한다. 이 생성자는 하나의 정수형 매개변수 v를 받아서 value에 할당한다.
MyClass(const MyClass& other) : value(other.value) {} 부분은 복사 생성자를 정의한다. 복사 생성자는 다른 MyClass 객체를 사용하여 새로운 MyClass 객체를 생성할 때 호출된다.
const MyClass& other는 복사할 원본 객체를 참조로 받는다. const는 이 객체가 수정되지 않음을 보장
: value(other.value)는 원본 객체의 value 값을 새로운 객체의 value에 복사한다.
이동 생성자
class MyClass {
public:
int* data;
// 생성자
MyClass(int size) {
data = new int[size];
std::cout << "생성자 호출: 크기 " << size << "의 배열 생성" << std::endl;
}
// 이동 생성자
MyClass(MyClass&& other) noexcept : data(other.data) {
std::cout << "이동 생성자 호출" << std::endl;
other.data = nullptr; // 원래 객체의 포인터를 nullptr로 설정
}
// 소멸자
~MyClass() {
if (data) {
delete[] data; // 소멸자에서 메모리 해제
std::cout << "소멸자 호출: 메모리 해제" << std::endl;
}
}
};
int main() {
MyClass obj1(10); // 생성자 호출
MyClass obj2 = std::move(obj1); // 이동 생성자가 호출됨
return 0;
}
이동 생성자는 C++11에서 도입된 개념으로, 리소스를 소유한 객체를 다른 객체로 "이동"할 때 호출된다.
MyClass(MyClass&& other) noexcept : data(other.data) {
std::cout << "이동 생성자 호출" << std::endl;
other.data = nullptr; // 원래 객체의 포인터를 nullptr로 설정
}
이동 생성자는 MyClass의 인스턴스가 다른 인스턴스에서 이동될 때 호출된다. data를 other.data로 초기화하여 원래 객체의 데이터를 새 객체로 이동한다. 이동 후, other.data를 nullptr로 설정하여 원래 객체가 더 이상 메모리를 가리키지 않도록 한다. 이는 이중 해제를 방지한다.
'C++' 카테고리의 다른 글
C++) 템플릿(Template) (0) | 2025.01.15 |
---|---|
C++) 포인터와 배열 (0) | 2025.01.13 |
C++) 상속 (0) | 2025.01.10 |
C++) 클래스(Class) (0) | 2025.01.08 |
C++) 동적 할당 (0) | 2025.01.06 |