2018년 5월 17일 목요일

C++ 11/14 관련 내용 대충 정리, 균일 초기화, 생성자 위임

최신 C++을 공부하려 책을 보긴 했었는데
내용이 기존 문법과 함께 여기저기 흩어져 있어 보기에 좀 어려워
MSDN을 참고하여 대충 정리하려함.
역시 설명은 MSDN이 갑이다..

C++11/14/17 기능에 대한 지원(최신 C++)
https://msdn.microsoft.com/ko-kr/library/hh567368.aspx


균일 초기화 및 생성자 위임

https://msdn.microsoft.com/ko-kr/library/dn387583.aspx


중괄호 초기화

https://msdn.microsoft.com/ko-kr/library/dn387583.aspx#Anchor_0

. 클래스, 구조체, 공용 구조체를 대상으로 중괄호 초기화 사용 가능
. 암시적, 명시적으로 선언된 기본 생성자가 있는 경우 중괄호 초기화 사용 가능
. 기본생성자가 삭제(=delete)된 경우, 중괄호 기본 초기화를 사용 할 수 없음.
. 초기화 할 있는 곳(함수 매개 변수, 반환값, new 키워드)에서 사용 가능

#include <string>  
using namespace std;  
  
class class_a {  
public:  
    class_a() {}  
    class_a(string str) : m_string{ str } {}  
    class_a(string str, double dbl) : m_string{ str }, m_double{ dbl } {}  
double m_double;  
string m_string;  
};  
  
int main()  
{  
    class_a c1{};  
    class_a c1_1;  
  
    class_a c2{ "ww" };  
    class_a c2_1("xx");  
  
    // order of parameters is the same as the constructor  
    class_a c3{ "yy", 4.4 };  
    class_a c3_1("zz", 5.5);  
}  

* 클래스에 기본 생성자가 없는 경우 중괄호 초기화에 클래스 멤버가 나타나는 순서는 멤버가 나타나는 순서이고 건너 뛸 수 없음.

class class_d {  
public:  
    float m_float;  
    string m_string;  
    wchar_t m_char;  
};  
  
int main()  
{  
    class_d d1{};  
    class_d d1{ 4.5 };  
    class_d d2{ 4.5, "string" };  
    class_d d3{ 4.5, "string", 'c' };  
  
    class_d d4{ "string", 'c' }; // compiler error  
    class_d d5("string", 'c', 2.0 }; // compiler error  
}   

class_d* cf = new class_d{4.5};  
kr->add_d({ 4.5 });  
return { 4.5 };  


위임 생성자

https://msdn.microsoft.com/ko-kr/library/dn387583.aspx#Anchor_2

. 다른생성자에 위임하는 생성자의 멤버를 초기화 할 수는 없음.

class class_c {  
public:  
    int max;  
    int min;  
    int middle;  
  
    class_c(int my_max) {   
        max = my_max > 0 ? my_max : 10;   
    }  
    class_c(int my_max, int my_min) : class_c(my_max) {   
        min = my_min > 0 && my_min < max ? my_min : 1;  
    }  
    class_c(int my_max, int my_min, int my_middle) : class_c (my_max, my_min){  
        middle = my_middle < max && my_middle > min ? my_middle : 5;  
}  
};  
int main() {  
  
    class_c c1{ 1, 3, 2 };  
}  


댓글 없음:

댓글 쓰기