【问题标题】:Object initialization with 0用 0 初始化对象
【发布时间】:2013-07-25 13:01:13
【问题描述】:

我想知道,如果我用 0 初始化一个对象会发生什么。

例如:

Class Vehicle
{
}

main()
{
Vehicle v =0;  // or
Vehicle v;
v=0;
}

【问题讨论】:

  • 语言是什么?
  • 这是什么语言?它的 C 风格被括号括起来,但除此之外......
  • 同意,这不是 C 或 C++。 职业训练中心
  • 你到底想知道什么?

标签: class object instance


【解决方案1】:

假设这是C++,这段代码会产生编译错误,至少有四个原因:

  1. 与 K&R C 不同,C++ 不支持具有隐式返回值的函数。 main 函数总是返回 int,并且必须显式声明。

  2. class 关键字不大写,语言区分大小写。这可能只是一个错字,但编译器不会在意。

  3. Vehicle 类的声明无效。类声明必须以分号结尾(在右大括号 } 之后)。

  4. Vehicle 类未定义接受整数(或任何可从 int 隐式转换的内容)的构造函数,因此您无法使用 0 初始化新的 Vehicle 对象。

【讨论】:

    【解决方案2】:

    除非您在 Vehicle 中有一个带有一个数字参数的构造函数,否则您会收到编译器错误,因为

    Vehicle v = 0;
    

    相同
    Vehicle v(0);
    

    第二种情况,需要定义赋值运算符。

    一般来说,我建议在询问之前实际尝试编译。

    【讨论】:

    • @CodyGray 不,我的意思是说第二个。 Vehicle v; 行定义变量并构造它(这是初始化),v = 0; 行因此是一个赋值,需要一个合适的赋值运算符。
    • 哦,哎呀,我假设“第二种情况”指的是您的第二行代码。完全忘记了问题中的两个例子。
    【解决方案3】:

    假设您的语言是 C++(并已更正以匹配)

    class Vehicle
    {
    };
    
    int main()
    {
        Vehicle v = 0;  // or
        Vehicle v;
        v = 0;
    }
    

    您将无法将 0 分配给堆栈分配的对象实例,因为在 Vehicles 和 ints 之间不存在重载赋值运算符(在 v = 0 的情况下或在 Vehicle v = 0; 的情况下合适的构造函数

    也许您正在考虑指向 Vehicle 的指针?

     Vehicle* vp = 0;
    

    这会将内存地址 0(在 C++11 中更好地表示为 NULLnullptr)分配给指针变量。

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 2019-11-05
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多