私有类变量

时间:2013-05-21 02:02:03

标签: c++

我无法访问其中一个程序中的私有类变量。我做了这个测试程序,但仍然不明白我做错了什么。

test.h

class Test
{
private:
    int Number;
public:
    int Randomize();
};

TEST.CPP

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

int Test::Randomize()
{
    Number == 1;
    std::cout << Number;
    return Number;
}

的main.cpp

#include "test.h"
#include <stdio.h>

int main(int argc, char* argv[])
{
    Test test;
    int result = test.Randomize();
    printf ("Number = %d", result);
    return 0;
}

编译时我收到此警告

test.cpp:6:9: warning: expression result unused [-Wunused-value]
        Number == 1;

正在输出

134514363Number = 134514363

我不知道发生了什么事。认为我超出了它的范围。但我的意思是它仍然编译得很好,以为如果我做得不对,我根本无法访问Number。

任何帮助将不胜感激。 感谢

5 个答案:

答案 0 :(得分:3)

==是等于运算符,它检查两个操作数是否相等。 =是赋值运算符,它将右操作数的计算值放在左操作数中。

它给你一个警告(不是编译器错误)来指示Number == 1;不习惯做任何事情,这很可能是程序员的错误(例如,它询问你是否打算使用{ {1}}而不是?)

最后,你得到=的原因是因为在C和C ++中,如果你没有将变量设置为任何东西,它有一个你无法预测的随机值,基于发生的事情。在那里记忆。基本上,C / C ++在声明变量时不会初始化变量。

通常,编译器警告值得一读 - 它们通常意味着程序中的错误。

答案 1 :(得分:3)

==是比较运算符;如果操作数相等,则返回bool true

=是赋值运算符;它将右操作数分配给左侧操作数并返回第一个操作数(作为左值)。

因此,对于Number == 1,您告诉编译器“检查Number是否等于1(并丢弃此类比较的结果)”;请注意编译器正在警告你 - 他说你有一个没有副作用的表达式,结果被丢弃,这显然是一个无用的指令,因此“怀疑”(因此警告)。

您想要的是Number = 1,即“将Number设置为1”。

换句话说,这里的问题是你永远不会在你的代码中为Number分配一个明确的值(因为你拼写错误=),Number仍然是“无限期” “value(在您的程序中,恰好是134514363,可能是由于CRT初始化例程中堆栈中剩余的垃圾)。

答案 2 :(得分:2)

此行正在使用equality运算符,其结果将被丢弃,因此警告:

Number == 1;

应该使用=运算符assignment

Number = 1;

答案 3 :(得分:1)

您在此处使用==(比较)代替=(作业):

int Test::Randomize()
{
    Number == 1; // oops!
    std::cout << Number;
    return Number;
}

此处的比较不执行任何操作,因此在打印时会使用垃圾值。

答案 4 :(得分:1)

你没有对你的号码做任何事情,编译器甚至警告过你。此外,调试器是你的朋友。