【问题标题】:Initializing a variable using default constructor [duplicate]使用默认构造函数初始化变量[重复]
【发布时间】:2015-03-22 12:36:18
【问题描述】:

我对 c++ 很陌生,我现在正在尝试学习所有基础知识, 我知道什么时候调用默认构造函数,但是当我尝试不同的语法时,它并没有像我预期的那样工作。

看下面的代码:

class a;
class b();
class c(NULL);

'class' 是我使用默认构造函数创建的类, 对于 a 和 c 一切正常,但对于 b 它只是不会将变量识别为类成员。

在我看来 b 和 c 基本相同,有什么问题呢? 谢谢!

【问题讨论】:

  • 你创建了一个名为class的类?
  • @OliverCharlesworth 差点把我的咖啡洒了。也许我想象到了怀疑的语气。
  • 我想你的意思是a和b基本相同,而不是b和c

标签: c++ class constructor


【解决方案1】:

不要将您的类命名为“class”,因为它是保留名称。

对于 C++,如果构造函数不带参数,则使用实例化它

Foo a;   // note, if you are using c++11, you can do Foo a{};

相对于:

Foo b();

实际上做了一些完全出乎意料的事情*,并声明了一个名为 b 的函数,该函数返回一个 Foo 实例。

至于Foo c(null),它不会编译,因为没有带参数的默认构造函数。


* 它被称为“最令人头疼的解析”,虽然我觉得这有点夸张。它当然会让你大吃一惊,但只要知道你可以在函数中声明一个函数原型,就足以消除“令人烦恼”的一面。

换句话说,int getMyInt(); 显然是放在任何函数定义之外的函数原型。然而,由于这也是在函数定义中的情况,int getMyInt(); 不会做任何它通常不会做的事情...这是定义一个函数原型 getMyInt 返回一个整数。

【讨论】:

    【解决方案2】:

    b 被解释为一个不带参数并返回 class 类型的对象的函数声明。

    这被称为most vexing parse 编辑:这是不是令人烦恼的解析

    【讨论】:

    • 不,这不是最令人头疼的解析。
    • @LightnessRacesinOrbit 实际上似乎是这样。我链接的公认答案是提供一些虚假信息。
    • 这是有点麻烦的解析。还有其他更令人烦恼的解析! (例如MyClass foo( OtherClass(x), OtherClass(y) );
    • @MattMcNabb:哈,我接受这个术语:D
    【解决方案3】:

    你的意思是这样的? NULL 代表 0,你知道的。 void 表示没有数据。

    class Cl_Test
    {
    private:
        int m_a;
    public:
        Cl_Test(int in_a= -1) { m_a= in_a; }
    };
    
    int main(int argc, char** argv) {
        Cl_Test a;
        Cl_Test b();
        Cl_Test c(void);
        return 0; }
    

    编辑:

    我的错误:

    • “变量”b:它不是变量,而是函数声明
    • 不应将 void 作为 C/C++ 中的参数传递

    【讨论】:

    • 你试过编译那个吗?
    • 您从 OP 的帖子中复制的错误是“变量”b。它不是一个变量,它实际上是一个函数声明。
    • @zenith stackoverflow.com/q/693788/560648 stackoverflow.com/a/5075577/560648 (tl;dr 这太可怕了)请注意,这个答案又犯了另一个错误,即传递 void 作为 argument 是非法(如您所料)。只有在声明中这样才有意义。
    • “我觉得这里受到了不必要的攻击” 这不是“不必要的”,也不是“攻击”:您的答案包含多个严重错误,并且没有抓住重点问题,简单明了。这不是个人的!
    • 你错了。​​您被提到了其他答案,这些答案解释了[一些]问题。下次请(a)尝试您的代码,并(b)查找您的代码的含义,然后再向某人建议他们应该使用它。请记住,您是在教学,因此有责任注意!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2012-09-15
    • 2011-06-17
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多