c++은 모르지만 추측해본다면 인자 하나를 받는 생성자이고, 인자가 없으면 0을 기본값으로 하고, 멤버변수 num을 인자값으로 초기화함
익명(210.113)2016-03-26 20:30
Cal 클래스 내부에 int num이 private 멤버변수로 있는건 알겠죳? 최초 Cal 생성시에 가령 Cal test(30); 처럼 한다면 Cal클래스의 test의 private멤버변수 num의값은 30이로 생성이되겠죠? 멤버이니셜라이져를 활용한 생성자라서 Cal(int val) : num(val) {} 라면요? 근데 int val = 0 이잖아요? 이건 val 의값이 입력되지 않았다면 val의값을 0으로 즉 num의값을 0으로 생성한다는거죳
흐린바다(1214qwer)2016-03-26 20:32
근데 저 사진 main에서 y랑 z는 객체 아님? 어떻게 객체끼리 + 연산자로 더함? 연산자 오버로딩이 다른데서 되있는거?
익명(210.113)2016-03-26 20:34
아마기본서 보고계시는거면 연산자 오버로딩 설명하면서 관련된부분도 언급했을꺼에양
흐린바다(1214qwer)2016-03-26 20:35
입력안하면 0임??
익명(175.120)2016-03-26 20:36
그리고 show 메소드를 클래스 밖에서 정의하는거같은데 그럼 클래스의 public에 선언?되어있는걸로 보이는 void show(); 문장은 일종의 인터페이스임?
익명(210.113)2016-03-26 20:36
그건 cal멤버 함수아니냐
익명(175.120)2016-03-26 20:37
클래스안에서 선언하고 정의는 밖에다 쓴것
흐린바다(1214qwer)2016-03-26 20:38
내가 궁금한건 내가 질문한게 이게 왜 다른생성자처럼 생기지않앗냐이거지 이해 못하겟음
익명(175.120)2016-03-26 20:38
그렇죠 cal 멤버함수를 클래스안에서 선언하고 정의는 밖에다
흐린바다(1214qwer)2016-03-26 20:38
엔터쳐보세요 그럼 다른생성자 님이말하는거처럼보일꺼임
흐린바다(1214qwer)2016-03-26 20:38
그렇게 하는 이유가 있는것? 아니면 c++에선 메소드를 정의하는 관용적인 방법인것?
익명(210.113)2016-03-26 20:38
보통 프라이빗 저걸 퍼블릭에서 _변수 식으로 바꿔서 연결시키는데
익명(175.120)2016-03-26 20:39
클래스이름(매개변수) : 멤버이니셜라이저를통해 할것 엔터치고 { 생성자가 할일 } 이런모양이잖아요? 다만 매개변수값이 int val인데 int val의 값 입력이 없을때는 int val = 0 이라고 지정해준것이고,
흐린바다(1214qwer)2016-03-26 20:39
그리고 num은 멤버 '변수'인데 어떻게 함수호출하듯 num(val) 이라고 쓸수있는것??
익명(210.113)2016-03-26 20:40
: 있잖아요 멤버이니셜라이져에 관한 얘기도 분명 기본서에 있을꺼임. Cal(int a) : num(a) 이렇게하면 Cal test(30);이럴때 int a 매개변수값이 30인거고 이 30을 num에 대입한다는거에요
생성자에얌
c++은 모르지만 추측해본다면 인자 하나를 받는 생성자이고, 인자가 없으면 0을 기본값으로 하고, 멤버변수 num을 인자값으로 초기화함
Cal 클래스 내부에 int num이 private 멤버변수로 있는건 알겠죳? 최초 Cal 생성시에 가령 Cal test(30); 처럼 한다면 Cal클래스의 test의 private멤버변수 num의값은 30이로 생성이되겠죠? 멤버이니셜라이져를 활용한 생성자라서 Cal(int val) : num(val) {} 라면요? 근데 int val = 0 이잖아요? 이건 val 의값이 입력되지 않았다면 val의값을 0으로 즉 num의값을 0으로 생성한다는거죳
근데 저 사진 main에서 y랑 z는 객체 아님? 어떻게 객체끼리 + 연산자로 더함? 연산자 오버로딩이 다른데서 되있는거?
아마기본서 보고계시는거면 연산자 오버로딩 설명하면서 관련된부분도 언급했을꺼에양
입력안하면 0임??
그리고 show 메소드를 클래스 밖에서 정의하는거같은데 그럼 클래스의 public에 선언?되어있는걸로 보이는 void show(); 문장은 일종의 인터페이스임?
그건 cal멤버 함수아니냐
클래스안에서 선언하고 정의는 밖에다 쓴것
내가 궁금한건 내가 질문한게 이게 왜 다른생성자처럼 생기지않앗냐이거지 이해 못하겟음
그렇죠 cal 멤버함수를 클래스안에서 선언하고 정의는 밖에다
엔터쳐보세요 그럼 다른생성자 님이말하는거처럼보일꺼임
그렇게 하는 이유가 있는것? 아니면 c++에선 메소드를 정의하는 관용적인 방법인것?
보통 프라이빗 저걸 퍼블릭에서 _변수 식으로 바꿔서 연결시키는데
클래스이름(매개변수) : 멤버이니셜라이저를통해 할것 엔터치고 { 생성자가 할일 } 이런모양이잖아요? 다만 매개변수값이 int val인데 int val의 값 입력이 없을때는 int val = 0 이라고 지정해준것이고,
그리고 num은 멤버 '변수'인데 어떻게 함수호출하듯 num(val) 이라고 쓸수있는것??
: 있잖아요 멤버이니셜라이져에 관한 얘기도 분명 기본서에 있을꺼임. Cal(int a) : num(a) 이렇게하면 Cal test(30);이럴때 int a 매개변수값이 30인거고 이 30을 num에 대입한다는거에요
초기화
오 이해됨
그럼 2개 이상의 인자를 받아 초기화하는 생성자를 만들려면 어떻게 해야함?
val을 num애 넣어라 라는뜻임
http://thrillfighter.tistory.com/222
이니셜라이저
내말 맞죠 바다형
구글에 멤버이니셜라이져 초기화로 검색하면 글많이나올꺼에요 찾아보세용
전횽아니고 개호좁입니다 ㅜㅜ val에 num을 넣어라.. 라는 뭐 그소리긴한데 정확한표현은 초기화라 해야 맞지않나싶은데.. 여튼 알아먹으면ㅋㅋㅋ
그러니까 레퍼런스 초기화 등을 하려면 저 문법이 강제적이라는 것?? 자바같은 다른 랭귀지에서도 저렇게 비일관적인 생성자 문법을 사용하나?
저 개호좁이라 다른언어는몰라요
그리고 비일관적이라는표현은좀.. 필요하면쓰고 아니면 다른거쓰는 그냥 기능일뿐임
좆까 난 멤버이니셜라이져 안쓸꺼야하고 Cal(int val = 0 ) {num = val;} 해도 지장은없음
그럼 C++14에서도 여전히 저렇게 해야함?
다만 멤버이니셜라이져를 활용함으로써 얻게되는 차이점같은것들이있는데 굳이 다 설명하지않을께요 찾아보셈. 왜 저런기능이 따로있는지
아니 님이준 링크에서 보면 레퍼런스 멤버변수 초기화할땐 멤버 이니셜라이저를 꼭써야하는거처럼 말하던데
저도첨배울때 똑같은 행동인데 왜 저렇게 다른방법을 만들어서 쓰는건가했는데 이유가있더라구요 차이가있음. 그를활용한 쓰임새도있고..
저거 전 잘 안읽어봐서모르겟음 구글링해서 걍나온거아무사이트나 준건데 님이 멤버이니셜라이져가 뭔지 잘모르시는거같아서 보라고..
아씨디시써버 개병신같네 댓글쓴거 다날라겐
아 디시서버 개병신같네 댓글왜이따구로달려..
그러니까 모든경우에서 멤버이니셜라이져를 사용해야하는건 아니다. / 멤버이니셜라이져 초기화를 통해 할경우 이점이있는경우나 멤버이니셜라이져 초기화로만 초기화가 가능한 경우들이 따로 있다 / 뭔지는 본지오래되서 다 설명하기 뭐시기하니 구글링해보면나올것
ㅇㅋ 그건알겠음 근데 너무 문법이 지저분한거같아서 혹시 c++ 최근 표준에서 개선이 되었나 궁금
안익숙하고 잘몰라서 지저분해보이는걸꺼임 쓰다보면 이니셜라이져로 초기화하는게 훨 편리함. { }하고 안에다가 num = val; 이지랄 하면서 전부다 하는거보다 : num(val) 하면 쓰기좋잖음? 이거 엔터치면서 잘끊어치면 보기도 더좋음
나는 생성자를 구현하는 서로다른 문법이 2개나 존재한다는게 지저분하다고 생각..
나도그생각이있긴했는데 이니셜라이져로는되고 그냥{ } 으로는 안되는 부분이 있다는점에서 차이가있다는거잖음? 내가 아는게 많지않아서 그렇지 분명한 차이가 있는거라 생각하고 넘어감
생성자가 할수있는걸 멤버이니셜라이저로 다 할수있잖음, 그렇다고 생성자가 멤버이니셜라이저보다 코드량이 적은것도 아니고 여러모로 생성자는 필요가 없어보이는 문법인데 뭐 언어가 발전하다보니 저꼴이 된건지는 모르겠지만..
{} 안에는 다른동작도할수있어..
이니셜라이저에서만가능한것 : const멤버변수 레퍼런스 멤버변수 부모의 인자있는 생성자 같은것들 초기화 / { }로 초기화하는경우에는 { int num = val + val2} 같은식도가능
예시가좀 아니다시픈데... 뭐 이니셜라이저 초기화에서도 저런식으로가능하긴한데.. 함튼 내가 부족해서 잘설명은 더 못하지만 교집합 같은 느낌임. A에서만되는것과 B에서만되는게있고 AB둘다 가능한게있고. 대게는 사용하는내용이 교집합부분들이라서 이니셜라이져로 초기화하는게 더 편하고 보기좋은느낌.
설명이 잘못된부분이 있다면 누가지적해주면좋겠음. 이부분은 나도 님처럼 예전에 첨배울때 생각했던거임. 뭐 쓰다보니까 차이가있꼬 어떨땐 뭐쓰는게 보기좋고 어떨떈 뭐쓰는게 보기좋고 이런게 그냥... 느껴져서 그렇구나하는부분이라 내가 모르는 실제로 다른뭔가가 더있으리라 짐작하고 그정도로 받아들이고 넘어간거라 내설명이 정확하고 명확하지않을수있음. 애초에 처음질문에 내가 답을한부분은 멤버이니셜라이져를통한 초기화 문법을 아에 모르시는거같아서 소개하고 키워드를 던져준수준임. 뭐이정도면.. 도움이될꺼다싶어서. 혀튼 그렇네요 미숙한사람입니다 ㅈㅅ
non-copyable member는 member initializer list 안쓰면 초기화할 방법이 없다. copyable이라고 해도 멤버 이니셜라이저 쓰면 그냥 초기화지만 생성자에 넣으면 디폴트생성 후 assigning하는거라서 퍼포먼스가 저하될 여지도 있고.