【问题标题】:Difference between two statements C++两个语句 C++ 之间的区别
【发布时间】:2013-10-23 06:58:54
【问题描述】:

假设我有一个class A 并且有声明:

A a1(1);

A a2; a2(1);

这两种说法有什么区别?
我知道第一个陈述很简单,但是陈述 2 旁边发生了什么?

【问题讨论】:

  • 希望你不是说A a2 : a2(1);

标签: c++ class object constructor operator-overloading


【解决方案1】:
A a1(1);

这通过调用带有参数1 的构造函数来创建类A 的实例a1

A a2; a2(1);

这实际上是两个陈述。第一个 A a2; 通过调用 A 的默认构造函数创建类 A 的实例 a2。第二个,a2(1);,然后使用参数1 调用A::operator()(或在A 未定义operator() 的情况下产生错误)。

【讨论】:

    【解决方案2】:

    不同的是,对于大多数类型,第二个不会编译。

    第一个声明一个变量并用值1初始化它。从这样的值初始化称为直接初始化

    第二个声明一个变量并默认初始化它;然后它会尝试像函数一样调用它,该函数仅在它具有operator() 的合适重载时才有效。在这种情况下,它会执行定义该运算符的任何操作。

    也许你的意思是:

    A a2; a2 = 1;
    

    默认初始化变量,然后赋值1。对于普通类型,这将与第一个具有相同的效果。对于定义构造函数和赋值运算符的类型,这将取决于它们是如何定义的。

    【讨论】:

      【解决方案3】:

      构造函数是在创建对象期间调用的特殊函数。因此,根据您的代码,第一个语句会编译,因为它有一个匹配的构造函数。但是第二个语句不会创建任何实例,因为您已经为它提供了实现。

      *class Shape
      {
      private:
          int cm;
      public:
      //    Shape()
      //    {
      //    }
      //    Shape(int m_cm)
      //    {
      //        cm=m_cm;
      //    }
      };*
      

      上面的代码可以创建一个实例,但它不能像初始化值一样 s(7).

      【讨论】:

        猜你喜欢
        • 2019-06-05
        • 2020-06-12
        • 1970-01-01
        • 2017-01-31
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多