C++에서 클래스를 생성하면 생성자가 자동으로 생깁니다.
여기서 생성자란!!
객체선언시 자동으로 실행되는 코드를 말합니다.
#include<iostream>
using namespace std;
class A {
A() {}; //이런 코드가 원래 생기지만 보이지 않을 뿐!!
};
int main(void) {
return 0;
}
Class를 선언하게 되면 해당 Class의 이름과 같은 함수가 생성되고
위와 같이 아무런 기능이 없이 생성되는 생성자를 '디폴트 생성자' 라고 합니다.
그리고 이 디폴트 생성자는 사용자가 아무런 기능을 넣지 않으면
코드 실행시 자동으로 생성되어 컴파일을 진행하게 됩니다.
즉, 생성자를 코드상으로 표현하지 않아도 컴파일 과정에서 자동으로 디폴트 생성자가 생성되는 것입니다.
생성자는 주로 초기값을 줄 때 사용되는 기능입니다.
#include<iostream>
#include<string>
using namespace std;
class A {
private:
int num;
char name[10];
public:
A(int num, char *name) {
this->num = num;
strcpy(this->name, name);
}
};
int main(void) {
A a(10, "Hwan");
return 0;
}
이런 식으로 초기값을 줄 수 있습니다.
단!! 주의할점!!!
현재 Visual Studio 2017버전 이상부턴 표준문법을 엄격히 사용하도록 하게 되어있습니다.
때문에 permissive- 모드로 기본 설정되어 있습니다.
Visual Studio는 문자열 저장방식을 (char *)이 아닌 string사용을 권장하고 있습니다.
때문에 전 버전을 사용하는 Visual Studio는 상관이 없지만 2017이상 버전을 사용하시는 분들은
아래와 같은 Error메시지를 볼 수 있습니다.
C2664 'A::A(A &&)': 인수 2을(를) 'const char [5]'에서 'char *'(으)로 변환할 수 없습니다.
때문에 이를 해결하기 위해선
프로젝트 -> 속성 -> C/C++ -> 언어 -> 준수 모드를 보시면 '예(/permissive-)'라고 되어 있는 부분을 '아니요' 로 설정하시면 됩니다.
혹은 Visual Studio에서의 표준 문법을 맞춰서 실행하고 싶으시다면 아래와 같은 코드로 작성하시면 됩니다.
#include<iostream>
#include<string>
using namespace std;
class A {
private:
int num;
string name;
public:
A(int num, string name) {
this->num = num;
this->name = name;
}
};
int main(void) {
A a(10, "Hwan");
return 0;
}
생성자는 이렇게 클래서의 맴버 변수들에 대한 초기 값을 주고 싶을 때 주로 사용됩니다.
단!! malloc을 사용해 객체를 만들면 생성자는 발생을 하지 않습니다.(정확히는 발생할 수가 없습니다.)
'프로그래밍 > C++' 카테고리의 다른 글
C++ this 포인터?? 그럼 *this 는 뭐지? (8) | 2019.02.22 |
---|---|
C++상속 관계에서의 생성자 호출 (4) | 2019.02.21 |
C++ public, protected, private에 대한 설명 (1) | 2019.02.19 |
c++ new의 사용법, malloc과의 차이(free, delete) (2) | 2019.01.19 |
객체, 인스턴스, 클래스 용어 정리!! (0) | 2019.01.17 |
댓글