【问题标题】:Member integer changes when directly instantiated from another class [duplicate]直接从另一个类实例化时成员整数发生变化[重复]
【发布时间】:2016-06-18 10:37:29
【问题描述】:

假设我有两个类,A 和 B。A 有一个整数,它通过其构造函数显示在控制台中。它还有一个 B 的成员对象。B 像 A 一样显示一个整数,但是当 A 创建它时它从 A 获取它的整数。整数必须直接传递给 B 的构造函数,因为它是一个 const 值。

因此,当 A 将自己的整数传递给 B 时,我希望 A 和 B 在控制台 (1) 中显示相同的数字。相反,当 B 的构造函数打印出它的整数时,它显示 -858993460。这是为什么? 当 A 实例化 B 对象时,为 B 的 const int 传递一个整数,为什么整数会改变值?

ma​​in.cpp

#include "A.h"

int main() {
A a;
std::cin.get();
return 0;
}

啊.h

#pragma once
#include <iostream>
#include "B.h"

class A {
public:
A() :
    b(NUM_A) 
{ std::cout << "A's number: " << NUM_A << std::endl; }

private:
B b;
const int NUM_A = 1;
};

B.h

#pragma once
#include <iostream>

class B {
public:
B (int num) : 
    NUM_B(num) 
{ std::cout << "B's int: " << NUM_B << std::endl; }

const int NUM_B;
};

【问题讨论】:

  • 不要将常量放在反模式的大写字母中,除非它们是预处理器宏

标签: c++ class initialization class-constants member-initialization


【解决方案1】:

您的代码中的问题是 bNUM_A 之前被初始化。

class A {
public:
    const int NUM_A = 1;

    A() :
        b(NUM_A)
    {
        std::cout << "A's number: " << NUM_A << std::endl;
    }

private:
    const int NUM_A = 1;
    B b;    

    //B b;    
    //const int NUM_A = 1;
};

【讨论】:

    【解决方案2】:

    A的定义中,成员b在成员NUM_A之前。因此,bNUM_A 之前被初始化。您传递给B 的构造函数的值是一个未初始化的值。

    更改A 中成员的顺序。而不是

    B b;
    const int NUM_A = 1;
    

    使用

    const int NUM_A = 1;
    B b;
    

    【讨论】:

    • 好的,谢谢。但我很好奇:如果我在 NUM_A 之前离开 b,如果我在 b 之前在构造函数中初始化 NUM_A,为什么它仍然不起作用?简单地说,编译器在实例化 b 时就知道 NUM_A 存在,它只是稍后再初始化它,对吧?
    • 忽略构造函数中的初始化顺序。所有对象都按照它们在类定义中声明的顺序进行初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    相关资源
    最近更新 更多