-1

当我尝试初始化构造函数时,我注意到了一些奇怪的错误。如果我只是展示它们是最简单的。

#include <iostream>


class MyClass {

public:

    int var1, var2, var3;

    MyClass() {

        var1, var2, var3 = 0;

    }

    MyClass(int one, int two, int three) {

        var1 = one;
        var2 = two;
        var3 = three;
    }

};


int main()
{
    MyClass object1(5, 6, 7);
    std::cout << object1.var1; // This works

    MyClass object2();
    std::cout << object2.var1; //Error object must have class type.

    MyClass object3 = MyClass();
    std::cout << object3.var1; //Now it works for some reason

    delete &object1;
    MyClass ojbect1(5, 6, 7); //error redefinition; multiple initialization
}

如您所见,由于某种原因,当我初始化 object2 时,不会打印值,除非与 object3 一样,语法写为 MyClass object3 = MyClass();

此外,当我删除 object1 时,我必须使用 & 运算符。这让我很惊讶在这个问题中考虑到 在 C++ 中删除一个对象,他们不使用与号。

最后,当我尝试重新初始化 myobject 时,编译器抱怨有多个定义。我尝试省略 MyClass 关键字,但它仍然不允许。

现在我当然可以用各种变通方法让程序做我想做的事,但我不明白为什么这些事情不能像我在这里写的那样做。

4

2 回答 2

4
MyClass object2();
std::cout << object2.var1; 

不起作用,因为object2它被解析为“一个不带参数并返回一个MyClass”的函数。请参阅 最令人头疼的解析:为什么不 A a(()); 工作?

delete &object1; 

是未定义行为的原因。您delete只能使用创建的对象new

MyClass object1(5, 6, 7);

是编译器告诉的问题。您不能在同一范围内重新声明名称。如果你希望它有一个新的值,你可以使用:

object1 = MyClass(5, 6, 7);
于 2015-11-23T21:17:52.983 回答
3
MyClass myobj2();

不是你想的那样。它声明了一个名为的函数,该函数myobj2返回一个MyClass.

MyClass myobj(5, 6, 7);

导致错误,因为即使你myobj之前删除,它仍然被声明为 type MyClass。删除对象不会取消声明变量。如果您删除它并想要重新创建它,请执行以下操作:

myobj = MyClass(5,6,7);

但是,删除本地对象是无稽之谈。您不必删除一旦超出范围就会被删除的对象。实际上你应该只delete使用通过创建的对象new,否则你有未定义的行为。

于 2015-11-23T21:15:26.913 回答