• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

생성자 우선순위에 관한질문

21.11.24 12:39 작성 조회수 221

0

강의 내용에 있어서

변수를 초기화하는 방법이 2가지 즉

매개변수에 직접 값을 대입하는 방법이랑

생성자를 이용해서 값을 초기화 하는 방법 이

2가지가 있다라고 배웠는데요

강의 내용에서처럼 두가지 모두 초기화되어있을때,

생성자에서 초기화된 내용을 우선시한다 라고 했는데

그렇다면, 순서가 매개변수에 있는 내용의 초기화 부분은

아얘 건너뛰고 생성자 부분의 초기화만 실행하는 것으로

이해하였는데 제가 이해한것이 맞는지 궁금합니다.

즉, 초기화를 2번할수는 없으니까 말이에요

 

또한가지 질문이 있는데요

이강의에서 나온 생성자 멤버 초기화 목록으로는

다른 클래스 뿐만 아니라 배열도 초기화가 가능한데,

전에 배운 고전적인 생성자 방식으로는

위의 두가지 즉 클래스와 배열을 초기화 할 수가 없더라고요.

혹시 방법이 있는건지 아니면 아얘 불가능한건지

알고싶습니다.

답변해주셔서 정말 감사합니다.

 

혹시몰라 예제코드도 첨부합니다.

 

using namespace std;

 

class Test

{

int num;

public:

//Test(const int& num)

//{

// this->num = num;

//}

 

Test(const int& num = 0)

:num(num)

{

 

}

};

 

class Date

{

int m_year;

int m_month;

int m_date;

int m_arr[5]{11,22,33,44,55};

Test num{1};

 

public:

 

 

Date(const int& m_year = 1900, const int& m_month = 1, const int& m_date = 1)

{

this->m_year = m_year;

this->m_month = m_month;

this->m_date = m_date;

}

 

//Date(const int& year = 0, const int& num = 0) :

// m_year(year),

// m_month(11),

// m_date(24),

// num{num},

// m_arr{ 1,2,3,4,5 }

//{

// m_year = 4535;

//}

 

void setDate(const int& m_year, const int& m_month, const int& m_date)

{

this->m_year = m_year;

this->m_month = m_month;

this->m_date = m_date;

}

 

void setYear(const int& m_year)

{

this->m_year = m_year;

}

 

int getYear()

{

return this->m_year;

}

 

int getMonth()

{

return this->m_month;

}

 

int getDate()

{

return this->m_date;

}

 

void copyThis(const Date& original)

{

this->m_year = original.m_year;

this->m_month = original.m_month;

this->m_date = original.m_date;

}

 

void printArr()

{

for (auto n : m_arr)

{

cout << n << " ";

}

cout << endl;

}

 

 

};

 

int main(int argc, char* argv[])

{

//Date date = (2021, 11, 24 , 555);

Date date(2021,555);

cout << date.getYear() << " " << date.getMonth() << " " << date.getDate() << endl;

date.printArr();

}

답변 2

·

답변을 작성해보세요.

0

skf346님의 프로필

skf346

2022.10.12

안녕하세요! 저도 1번 질문과 비슷한 의문이 들어 디버거를 찍어봤는데요!

안소님이 말씀하신거랑 조금 다른거 같아 답변 남깁니다!(안소님의 정성스러운 답변으로 항상 많이 배우고 있습니다ㅎㅎ)

#include <iostream>

#include <string>

#include <vector>

using namespace std;

class B

{

private:

int m_b;

public:

B(const int& m_b_in)

: m_b(m_b_in)

{}

};

class Something

{

// 생성자가 없을시 여기서 init

// 있으면 거치지 않음

private:

int m_i = 100;

double m_d = 100.0;

char m_c = 'F';

int m_array[5] = {100, 200, 300, 400, 500};

B m_b{ 1024 };

public:

Something()

: m_i(1)

, m_d(3.14)

, m_c('a')

, m_array{1, 2, 3, 4, 5}

, m_b(m_i - 1)

{

m_i = 2;

m_d = 6.28;

m_c = 'b';

}

// 순서는 위에서 아래로.

void print()

{

cout << m_i << " " << m_d << " " << m_c << endl;

for (auto& element : m_array)

cout << element << " ";

cout << endl;

}

};

int main()

{

Something smth;

smth.print();

return 0;

}

저의 경우 Something 생성자 m_i(1)에 디버거가 위치해 있을 때 m_i에 쓰레기 값이 들어있었습니다!

이로 추정해 본 바, 멤버(private부분) 초기화를 거치지 않고 생성자에 들어왔을 때 초기화가 되는 것으로 생각하는 것이 맞다고 생각했습니다.

추가로 궁금해진 사항은 '그럼 생성자 이니셜라이져리스트 다음 중괄호 안에 내용은 초기화인 것인가?'라는 의문이 들었는데요.

교수님께서 직접 보여주셨듯이

{

m_i *= 2;

m_d *= 2.0;

}

와 같은 산술 연산이 가능한 것을 보아 초기화가 아닌 것으로 추정됩니다.

혹시 제 생각이 잘못되었다 하시면 답변으로 수정 부탁드립니다!

 

0

안소님의 프로필

안소

2021.11.25

"그렇다면, 순서가 매개변수에 있는 내용의 초기화 부분은

아얘 건너뛰고 생성자 부분의 초기화만 실행하는 것으로

이해하였는데 제가 이해한것이 맞는지 궁금합니다.

즉, 초기화를 2번할수는 없으니까 말이에요"

라고 하셨는데 초기화 2번한게 맞습니다. 건너 뛴거 아니에요!

순서 상 멤버초기화 목록을 거치고 중괄호(생성자 바디 부분)으로 들어오니까 이 부분에서 초기화하는 코드 또 넣으면 당연 뒤의 내용으로 덮히겠죠. 그런 의미에서 우선된다고 말씀하신 것 같습니다.

고전적인 생성자 방식은 어떤걸 말씀하시는걸까요? 초기화 멤버 목록이 없는 형태 말씀이신가요?

배열 멤버 선언할 때 int arr {1,2,3,4,5} 이렇게 초기화 해도 될 것 같은데요!@