티스토리 뷰
struct의 경우. 접근지정자가 기본적으로 public이기 때문에 선언 및 초기화가 어렵지 않다. 먼저 struct로 아래처럼 구조체를 만든 후, 선언과 초기화를 하면 2가지를 볼 수 있다.
1 2 3 4 5 6 7 8 | #pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <Windows.h> struct param { SOCKET m_sock; BOOL m_bClose; }; | cs |
첫 번째 방법은 가장 흔하게 사용되는 방법으로 먼저 선언을 하고 내부 멤버를 직접 하나하나 초기화하는 방법이다.
1 2 3 4 5 6 7 8 9 10 | int main( __in int argc, __in char* argv[]) { struct param p; p.m_sock = NULL; p.m_bClose = TRUE; } | cs |
두 번째 방법은 선언과 함께 구조체를 초기화하는 방법이다. 배열의 내용을 초기화하는 방법과 비슷하다.
1 2 3 4 5 6 7 8 | int main( __in int argc, __in char* argv[]) { struct param p = {NULL, TRUE}; } | cs |
만약 단순하게 0으로 초기화 하고자 한다면, 별도의 내용을 넣지 않아도 된다. struct는 위처럼 외부에서 내부 멤버로 직접 접근하는 것이 허용되기 때문에 아무 문제없이 초기화된다.
class는 기본 접근 지정자가 private이다. 그래서 외부에서 내부에 대한 접근을 허용하지 않기 때문에 다음과 같은 코드는 허용되지 않는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <Windows.h> #include <cstdio> class param { SOCKET m_sock; BOOL m_bClose; }; int main( __in int argc, __in char* argv[]) { param ti = {NULL, TRUE}; return 0; } | cs |
하지만 단순하게 0으로 초기화를 원하는 경우는 허용해 준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <Windows.h> #include <cstdio> class param { SOCKET m_sock; BOOL m_bClose; }; int main( __in int argc, __in char* argv[]) { param ti = {}; return 0; } | cs |
그렇다면 class의 멤버 내부를 초기화하는 방법은 없을까? c++ 문법에서 class가 나올 때, 접근 지정자 이외에 생성자와 소멸자 개념도 함께 나온다. 그리고 보통 생성자를 사용해서 초기화를 하고 소멸자를 사용해서 내부를 정리한다. 그래서 생성자를 만들 때, 인자를 지정하는 경우, 아래와 같은 코드가 허용된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <Windows.h> #include <cstdio> class param { public: param(SOCKET sock, BOOL b) { m_sock = sock; m_bClose = b; } private: SOCKET m_sock; BOOL m_bClose; }; int main( __in int argc, __in char* argv[]) { param p = { NULL, TRUE }; return 0; } | cs |
p를 선언과 함께 넣어준 NULL, TRUE는 생성자의 인자 2개로 차례대로 들어가 내부 멤버를 초기화 해준다. 만약 인자가 1개만 있다면, 선언과 함께 넣을 수 있는 값은 1개 뿐이다. 결론은 class 선언과 함께 초기화해주는 값은 struct와 같이 멤버 변수로 들어가지 않고, 생성자의 인자로 들어간다는 점이다. 따라서 위처럼 멤버 변수를 그대로 초기화한다는 보장은 없다.
마지막은 지금까지 확인한 방법으로 선언과 초기화를 시도해본 코드이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #pragma comment(lib, "ws2_32.lib") #include <WinSock2.h> #include <Windows.h> #include <ppl.h> #include <cstdio> class param { public: param(SOCKET sock, BOOL b) { m_sock = sock; m_bClose = b; } private: SOCKET m_sock; BOOL m_bClose; Concurrency::critical_section m_Sync; }; struct info { struct sockaddr_in m_sa; struct param m_param; }; int main( __in int argc, __in char* argv[]) { SOCKET sock = NULL; struct tInfo ti = {{}, {NULL, TRUE, }}; if(ti.m_param.m_bClose) puts("zzz\n"); else puts("%x\n", ti.m_param.m_sock); return 0; } | cs |
참고
- 구조체 선언 및 초기화 : https://dojang.io/mod/page/view.php?id=408
'Programming > C' 카테고리의 다른 글
[WinSock] Windows Socket2 구조 (0) | 2019.09.18 |
---|---|
[libcurl] libcurl API 목록 (0) | 2019.05.09 |
[Compression] Compression 모음 (0) | 2019.02.19 |
[Windows WebServer] Windows web server application 제작 및 SSL 바인딩 (0) | 2019.02.12 |
[C++] c++ hexdump (0) | 2019.02.01 |