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