-2

当我们在类中声明变量然后为这些变量赋值时,例如像这样

class c {

    public :

    int x;
    int x2;

    c () {
        x = 0;
        x2 = 0;

        scanf ("%d", &x); and now we're gonna input for example 10
    } 
};

每次使用类时,我的意思是每次调用构造函数时,x 的值再次变为 0,因为它在构造函数中被初始化为零。但是,如果我们不初始化该值,则会出现错误。

我的问题是,当我们一次又一次地调用构造函数时,我们如何保持变量的值不会变为零?

编辑:

void example () {

int i;
scanf ("%d", &i); 
switch (i) {
case 1 : {Object ob1; system ("cls"); menu ();} // this object contains a value like 20 
case 2 : {Object ob2; system ("cls"); menu ();} 
}  

}

对象 1 中还有另一个开关盒,其中包括返回主菜单的选项,现在如果我再次输入 1 则返回对象 1 我看不到值 20,它将为 0

4

3 回答 3

1

每个实例只调用一次构造函数,因此需要担心这一点。由于其构造函数,您永远不会将给定实例的 x 值重置为 0。

于 2013-01-12T10:53:54.240 回答
0

您可以将其存储在静态变量中。然后从该静态变量中读取 x 的值。

于 2013-01-12T10:53:32.127 回答
0

您了解类和对象/实例之间的区别吗?类只是对象的“千篇一律”。您不会像这样“调用”构造函数,而是创建类的实例(隐式调用构造函数):

c myObj; 
c anotherObj; 

此代码将创建类 c 的两个实例,它们都有自己的 x1 和 x2 版本。确实,构造函数在创建时第二次运行anotherObj,但它在完全不同的内存上运行。所以myObj不会触及 x1 和 x2 in 的值。

编辑:类成员函数的要点是它们对名为 this 的隐式附加参数进行操作。您可以想象“构造函数调用”实际上看起来像这样(仅用于说明目的,并不意味着是有效代码):

c* this = malloc(sizeof(c));
constructor(c);
// With "constructor" actually being:

void ctor(c* this) {
    this->x1 = 0;
    this->x2 = 0;
    // ..
}

这也可以在 C 中实现 - 但在 C++ 中,它是隐式发生的,您无需编写这样的代码。你只写c newObj;or c* obj = new c;

除此之外:成员变量应该是私有的,并且您将 C 库代码 ( scanf) 与 C++ 类混合 -iostreams用于 C++ 中的输入/输出。

于 2013-01-12T10:57:06.133 回答