如何在不调用C++构造函数的情况下创建对象?

Mar*_*dik 2 c++

以下程序有5个文件.输出为0 32,而不是14 32,因此构造对象时不调用构造函数.这怎么可能?

character.h:

#ifndef CHARACTER_H
#define CHARACTER_H 

class Character
{
public:
    Character() {}

    class Settings
    {
    public:
        int size_;
        Settings():
            size_(14)
        {}
    };
    const static Settings DEFAULT_SETTINGS;
};

#endif // CHARACTER_H
Run Code Online (Sandbox Code Playgroud)

character.cpp:

#include "character.h"

const Character::Settings Character::DEFAULT_SETTINGS;
Run Code Online (Sandbox Code Playgroud)

word.h

#ifndef WORD_H
#define WORD_H

#include <iostream>

#include "character.h"

class Word 
{
public:
    Word() {}

    class Settings
    {
    public:
        Character::Settings characterSettings_;
        int length_;

        Settings():
            length_(32)
        {
            characterSettings_ = Character::DEFAULT_SETTINGS;
        }
    };

    static const Settings DEFAULT_SETTINGS;

    void write(Settings settings = DEFAULT_SETTINGS) // this default parameter is 
                                                     // constructed without a   
                                                     // constructor call
    {
        std::cout << settings.characterSettings_.size_ << std::endl;
        std::cout << settings.length_ << std::endl;
     }
 };

#endif // WORD_H
Run Code Online (Sandbox Code Playgroud)

word.cpp

#include "word.h"

const Word::Settings Word::DEFAULT_SETTINGS;
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "word.h"

int main(int argc, char *argv[])
{
    Word member;
    member.write();
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

Dav*_*eas 6

这称为静态初始化惨败.基本上,对于具有在不同转换单元中定义的静态持续时间的变量,构造函数的执行没有固定顺序.在这种特殊情况下,Word::DEFAULT_SETTINGS它已经在之前构造Character::DEFAULT_SETTINGS,因此0在实际初始化之前读取了静态持续时间变量的值.如果你想看到一些有趣的东西,转储内容,Character::DEFAULT_SETTINGS你就会看到奇怪的东西14