为什么在类中声明的变量在函数中定义可以初始化?

时间:2015-02-15 03:13:29

标签: c++

在以下代码中:

#include <iostream>
class A {
public:
    void show_all(){std::cout << x1 << ", " << y1 << ", " << z1 << std::endl;}
    void show_uninit();
private:
    int x1;
    int y1;
    int z1;
};
void A::show_uninit()
{
    int i;
    int j;
    int k;
    std::cout << i << ", " << j << ", " << k << std::endl;
    return ;
}
int main()
{
    A a;
    a.show_all();
    a.show_uninit();
    return 0;
}

编译后得到以下警告:

$ g++ -Wall test_construction.cpp
test_construction.cpp: In member function ‘void A::show_uninit()’:
test_construction.cpp:22:18: warning: ‘i’ is used uninitialized in this function [-Wuninitialized]
     std::cout << i << ", " << j << ", " << k << std::endl;
                  ^
test_construction.cpp:22:31: warning: ‘j’ is used uninitialized in this function [-Wuninitialized]
     std::cout << i << ", " << j << ", " << k << std::endl;
                               ^
test_construction.cpp:22:44: warning: ‘k’ is used uninitialized in this function [-Wuninitialized]
     std::cout << i << ", " << j << ", " << k << std::endl;
                                        ^

我的理解是成员a.x1,a.y1和a.z1应该得到与i,j和k相同的警告,因为对象&#34; a&#34;在函数main()中通过声明&#34; A a;&#34;来定义,尽管它是在类中声明的任何函数。 谢谢!

1 个答案:

答案 0 :(得分:5)

在这种情况下,编译器不够智能,无法生成警告。

注意:编译器不会产生任何警告或错误这一事实并不意味着您的代码是正确的。很多人在开始编程时都没有意识到这一点。

编译器甚至不需要为show_uninit生成警告,尽管有很多警告,因为检测从未初始化的局部变量相对容易。 (如果ijk已初始化有时,则可能不会收到警告)

执行后,show_all会打印不可预测的值,就像show_uninit一样。