inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Học C++ cùng Hong Jeong-mo

8.4 Danh sách khởi tạo thành viên hàm tạo

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

396

j0821751113

33 câu hỏi đã được viết

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();

}

C++

Câu trả lời 2

0

skf346

안녕하세요! 저도 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

sohyun

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

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

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

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

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

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

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

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

변수가 메모리에 저장되는 것을 알려주는 강의가 어떤강의였죠

1

466

1

메모리 주소 10진수로 출력

1

653

1

클래스 템플릿 특수화에서 boolalpha로 표현된 리턴값에 대해 질문이 있습니다.

1

499

1

여러가지 리턴 타입에 관한 강의가 어떤 걸까요?

1

534

1

메모리 주소에 관한 질분

0

679

1

인터페이스 클래스에서 reportError의 매개변수에 대해 궁금한 것이 있습니다.

0

549

1

형변환 오버로딩에서 const 관련 질문이 있습니다.

0

443

1

Digit 뒤에 reference를 사용하는 이유

0

510

1

4.2 전역 변수, 정적 변수, 내부 연결, 외부 연결

0

323

1

dat파일이...

0

539

1

TODO:대입 연산자 오버로딩에 대한 소스코드입니다.

0

644

1

복사 생성자 관련 질문이 있습니다.

0

454

1

수업 중 궁금한점이 있습니다.

1

390

1

라이브러리자체가 이해가 되지 않습니다.

0

561

1

마지막 예제 질문

0

302

1

증감연산자 위치에 따른 수행 순서 질문입니다.

0

375

1

단항 연산자 오버로딩에서 return 부분에 질문이 있습니다.

1

411

1

friend함수 관련 질문이 있습니다.

0

312

1

operator+ 정의부분에서 궁금한 것이 있습니다.

0

447

1

3분 17초 질문

0

350

1

함수에 값을 대입한다는 개념이 이해가 되지 않습니다.

0

448

1

int getvalue() const에서 const는 왜 뒤에 붙는건가요?

0

445

2

const Something &st에서 const를 빼면 안되나요?

0

300

1

friend함수는 다른 클래스의 멤버함수로 쓸 수 없나요??

1

493

1