【问题标题】:Why this data member is initialized? [duplicate]为什么这个数据成员被初始化? [复制]
【发布时间】:2013-06-28 02:27:01
【问题描述】:

我正在做一些测试... 首先我发布我的源代码

.h 文件

class Complex{
    private:
        int r = 0;//initializer
        int i ; 
    public:
        Complex(int , int I = 0);
        Complex();
        void print();
        void set(int, int I = 1);
        static void print_count();
        static int count;
};

.cpp 文件

#include <iostream>
#include "complex.h"

int Complex::count = 1;

Complex::Complex(int R , int I){
    r = R;
    i = I;

    count++;

    std::cout << "constructing Complex object...count is " << Complex::count << std::endl;
}

Complex::Complex(){//default constructor
    std::cout << "default constructor is called..." << std::endl;
}

void Complex::print(){
    std::cout << "r = " << r << ';' << "i = " << i << std::endl;
    return;
}

void Complex::set(int R, int I /*= 2*/){//will be "redefaulting", an error
    r = R;
    i = I;
    return;
}

void Complex::print_count(){//static
    Complex::count = -1;//jsut for signaling...

    std::cout << "count is " << count << std::endl;
    return;
}

主要功能

#include <iostream>
#include "complex.h"

int main(){
    Complex d;//using default constructor
    d.print();

    /*Complex c(4, 5);*/
    Complex c(4);
    //c.print();

    /*c.set(2, 3)*/
    c.print();
    c.set(2 );
    c.print();

    std::cout << "count is " << c.count << std::endl;//c can access member data
    c.print_count();
    c.count++;//

    return 0;
}

考虑使用默认 ctor 构造的 Complex 对象 d

因为数据成员 r 是用 0 初始化的,所以在执行 d.print() 时, r 预计为 0

我不是,所以我认为它是垃圾值

但是当我在测试时,发生了一件奇怪的事情。

如果我在主文件中删除此代码和以下代码行:

std::cout

然后 d.print() 将在我的系统上将 i 的值设为 32767,我猜这是一个垃圾值;

但是一旦添加了该行,d.print() 就会在我的系统上将 i 的值设为 0。

我不明白。我没有设置、修改或初始化i的值,为什么应该是0?

或者,它也是一个垃圾值?

或者,调用其中一个函数会破坏 i 的值?

这里的幕后是怎么回事?

感谢您的帮助。

【问题讨论】:

    标签: c++ compiler-construction initialization default-constructor


    【解决方案1】:

    0 与其他任何值一样都是垃圾值。不要错误地认为其他方式。

    从形式上讲,读取未初始化的变量是未定义的行为,因此没有必要怀疑它:只需通过正确初始化变量来修复它。

    【讨论】:

    • 我是 C++ 的初学者,花一点时间测试这些还不错,很高兴看到有人在做同样的事情并有人解释
    猜你喜欢
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多