【问题标题】:What is the difference between class a() and class a = class() in C++?C ++中的类a()和类a = class()有什么区别?
【发布时间】:2018-01-15 03:46:45
【问题描述】:

来自 Java 和 C# 世界,我一直喜欢使用

someclass a = someclass();

而不是

someclass a();

在 C++ 中初始化一个类变量。但是,我的编译器有时会抱怨

Error C2280: Attempting to reference a deleted function

它们之间有什么区别吗?哪个更好?

【问题讨论】:

标签: c++ class initialization


【解决方案1】:

它们之间有什么区别吗?

一个大的:someclass a(); is declaring a function!

someclass a = someclass();,在C++17's copy ellision 之前,要求类是可移动的,这可能不是这里的情况,因为您收到错误Attempting to reference a deleted function

哪个更好?

没有。改为使用:

someclass a;

someclass a{}; // C++11

两者都会调用default constructor

【讨论】:

  • 具有需要参数的构造函数的类怎么样?除了您提到的缺点之外, someclass a(param) 和 someclass a = someclass(param) 是否相同?
  • @AmazingJustus someclass a() 被视为函数声明的特殊情况主要适用于没有任何参数的情况。但是你可以找到一些带有参数的情况,例如someclass a(someother()),这也会导致函数声明。
  • 这些将通过使用花括号或添加额外的括号来更正:someclass a( (someother()) )
  • someclass a(param)someclass a = someclass(param),首选第一个。
【解决方案2】:

Dear Friend in C++ 用户创建对象如下

类名对象名;

#include<iostream>
using namespace std;

class demo
{
   public:
      void print()
         {
           cout<<"Demo class";
         }
 };
int main()
   {

      demo d;
      d.print();
      return 0;
   }

输出 演示类

使用指针对象

#include<iostream>
using namespace std;
class demo
{
   public:
      void print()
         {
           cout<<"Demo class using pointer object";
         }
 };

int main()
   {

      demo *d = new demo();
      d->print();
      return 0;
   }

输出 使用指针对象的演示类

在java中,垃圾收集是自动完成的。我希望你理解概念。

【讨论】:

  • 建议:为了击败您的结束语,您应该将delete d; 添加到最后的main。更正:void main() 在 C++ 中无效。 C++ 标准要求main 返回int。一个小问题:你可以在整个编程生涯中看到除了堆栈和堆之外的任何东西,但是 C++ 不需要堆栈和堆。堆栈和堆只是自动和动态存储的最常见(迄今为止)实现。
  • void main() 将在 turboc 中工作。它不是无效的语句。在 gcc 编译器中,必须指定为 int。在我的第三点中,我指定必须使用删除运算符来释放内存。我在答案中附上了 turbo c 编译器屏幕截图
  • @K.Vani 说某些编译器编译某些东西并不意味着它是有效的 C++ 代码。编译器有错误,而旧的编译器(如 turboc)往往有很多错误。
  • @K.Vani TurboC++ 在 1998 年 C++ 标准化之前来来去去。它是一种不同的语言。了解一个,您可以像使用 C 和 C++ 一样混淆另一个,但是有许多差异会让您感到困惑。这是其中之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2018-10-11
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多