3

私はMSDNの助けを借りてWindowsプログラミングを学んでいます。なぜ誰かが次のようなオブジェクトを初期化するのでしょうか?

WNDCLASS wc = { };

これにより、オブジェクトのすべてのメモリがゼロになりますか?ソースコード全体は次のとおりです。

#ifndef UNICODE
#define UNICODE
#endif 

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[]  = L"Sample Window Class";
    WNDCLASS wc = { };

    wc.lpfnWndProc   = WindowProc;
    wc.hInstance     = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    // Create the window.

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
        );

    if (hwnd == NULL)
    {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    // Run the message loop.

    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            HDC hdc = BeginPaint(hwnd, &ps);

            FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));

            EndPaint(hwnd, &ps);
        }
        return 0;

    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
4

1 に答える 1

2

おそらく自動初期化を利用するためです。

参照:

C ++ 03標準8.5.1
パラ7の骨材:

リスト内の初期化子が集約内のメンバーよりも少ない場合、明示的に初期化されていない各メンバーは値初期化されます(8.5)。[例:

 struct S { int a; char* b; int c; };
 S ss = { 1, "asdf" };

、、、および形式の式の値、つまり。で初期化しss.aます。]1ss.b"asdf"ss.cint()0

値の初期化はで定義されていますが、
C ++ 03 8.5初期化子
パラ5:

タイプTのオブジェクトを値初期化
するということは、次のことを意味します 。— Tがユーザー宣言コンストラクター(12.1)を持つクラスタイプ(9節)の場合、Tのデフォルトコンストラクターが呼び出されます(Tの場合、初期化は不正な形式になります)アクセス可能なデフォルトコンストラクタはありません);
— Tがユーザー宣言コンストラクターのない非ユニオンクラスタイプである場合、Tのすべての非静的データメンバーと基本クラスコンポーネントは値で初期化されます。
— Tが配列型の場合、各要素は値で初期化されます。
—それ以外の場合、オブジェクトはゼロで初期化されます

于 2012-09-25T09:38:42.040 に答える