【问题标题】:Object initialization syntax in C++ [duplicate]C ++中的对象初始化语法[重复]
【发布时间】:2016-02-26 03:12:00
【问题描述】:

我在尝试初始化构造函数时发现了一些奇怪的错误。如果我只是展示它们是最简单的。

#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 时,我必须使用 & 运算符。考虑到这个问题Deleting an object in C++ 他们不使用与号,这让我感到惊讶。

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

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

【问题讨论】:

  • 你创建了一个myobj2,然后你打印了'myobj.var1'是这个错字吗?
  • o_O 你为什么要delete一个局部变量?
  • 默认初始化语法类似于MyClass obj;,而不是MyClass obj();。第二个其实是一个不带参数返回MyClass的函数。
  • 请重新检查您的代码,它与您评论的错误不一致。尤其是输出语句。
  • 他们在另一个问题中不必使用&amp; 的原因是delete 的参数是指针变量,而不是类类型的变量。

标签: c++ oop constructor delete-operator object-initialization


【解决方案1】:
MyClass myobj2();

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

MyClass myobj(5, 6, 7);

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

myobj = MyClass(5,6,7);

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

【讨论】:

  • 废话不多说,是UB。
  • @JamesRoot 我打字比思考快,我很高兴你没有看到这个答案的超级废话第一版;)
  • @tobi303 我看到了:P 我也是这样做的,通常我的答案平均要经过大约 5 次编辑才有意义 :)
  • 问题已编辑,代码中有几个拼写错误
  • 点赞。我现在看到了函数语法。我的错,我有时会在 python、java 和 C/C++ 语法之间感到困惑。
【解决方案2】:
MyClass object2();
std::cout << object2.var1; 

不起作用,因为 object2 被解析为“一个不带参数并返回 MyClass 的函数”。看 Most vexing parse: why doesn't A a(()); work?

delete &object1; 

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

MyClass object1(5, 6, 7);

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

object1 = MyClass(5, 6, 7);

【讨论】:

  • 问题已编辑,代码中有几个错别字
  • 好的,这工作了一段时间,但现在我重载了 = 运算符,它在复制构造函数中调用了一个无限循环。
  • @bigcodeszzer,请针对该特定问题提出不同的问题。和往常一样,最好发Minimal, Complete, and Verifiable example
猜你喜欢
  • 2021-05-23
  • 2014-06-21
  • 2015-12-03
  • 2010-09-27
  • 2013-07-23
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多