gpt4 book ai didi

c++ - C++中如何不调用构造函数就创建对象?

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:32 24 4
gpt4 key购买 nike

以下程序在 5 个文件中。输出是 0 32,而不是 14 32,因此在不调用构造函数的情况下构造了一个对象。这怎么可能?

字符.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

字符.cpp:

#include "character.h"

const Character::Settings Character::DEFAULT_SETTINGS;

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

word.cpp

#include "word.h"

const Word::Settings Word::DEFAULT_SETTINGS;

主要.cpp

#include "word.h"

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

最佳答案

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

关于c++ - C++中如何不调用构造函数就创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9797865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com