본문 바로가기
프로그래밍/C++

C++의 생성자, 문자열 초기화 C2664 오류시 해결!!

by Hwan2 2019. 2. 20.
728x90
반응형

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을 사용해 객체를 만들면 생성자는 발생을 하지 않습니다.(정확히는 발생할 수가 없습니다.)

 

반응형

댓글


스킨편집 -> html 편집에서