【问题标题】:confused in copy constructor and objects in C++对 C++ 中的复制构造函数和对象感到困惑
【发布时间】:2021-06-12 11:56:51
【问题描述】:

我在 Stack Overflow 上看到了其他问题,但他们只回答了一部分。
假设我们有一个类-

class student
{
public:    
    string name;    
    student(string a)
    {
        name = a;
        cout << "parmeteised const." << endl;
    }

    student(student &a)
    {
        name = a.name;
        cout << "Copy const." << endl;
    }
};

int main()
{
    student a("Vyom");
    student c(a);
    if (a == c)
    {
        cout << "same";
    }
    return 0;
}

这不会编译并给出错误-

no operator "==" matches these operands -- operand types are: student == student

现在我知道这是错误的,我必须重载运算符才能这样做。

我的疑问:

  1. 我们在复制构造函数中有参数&amp;a,但我们在创建对象c时只输入a
  2. 如果第 1 点为真且有效,则可能意味着a 代表对象的内存位置。
  3. 如果第 2 点为真且有效,那么为什么我不能比较 ac 的内存位置
    (我知道内存位置将是十六进制但必须有一种方法可以转换将它们转换为 int 然后进行比较)。
    我是初学者,请帮助我澄清我的疑问。

【问题讨论】:

  • 您是正确的,没有对象 a 从主框架复制到构造框架,因为您使用的是引用。但这并不意味着“a 代表对象的内存位置”。这是因为当 C++ 通过引用获取参数时,在底层,它会查找该对象的内存地址,但作为程序员的您在任何时候都不需要传递该指针。

标签: c++ class pointers constructor


【解决方案1】:
  1. 我们在复制构造函数中有参数 &a,但我们只输入了一段时间来创建对象 c。

在函数student(student &amp;a) 中,变量“a”是对学生的引用。它不是指针 (student* a)。

如果要比较两个 student 对象,则必须实现比较运算符 ==operator_comparison

【讨论】:

  • 我对此感到困惑,感谢您的指出。
  • 我认为应该提到student &amp;a是一个参考。 &amp;a 本身很可能意味着变量 a 的地址。
  • @churill :你是对的,我稍微改变了我的答案。谢谢。
  • @churill 所以现在这意味着ac 都指向相同的内存位置,因为它们具有与我通过引用传递的相同地址。那么这是否意味着它们是相同的对象?
  • @VyomYadav 也许值得解释一下 a 和 c 是不同内存位置的克隆,它仍然由编码器确定何时克隆是相同的:例如它们具有相同的名称是否足够,或者所有其他成员变量(如果有其他成员变量)也必须匹配?字符串必须完全相同,还是它们的大小写可以变化而不影响身份?等
【解决方案2】:

您必须为该类重载(实现)== 运算符。下面是一个示例 == 您的类的运算符实现 -

bool operator==(const student& a) const {
    if (a.name == this->name) return true;
    
    return false;
  }

现在您的代码应该如下所示 -

#include <iostream>
using namespace std;
class student
{
public:    
   string name;    
   student(string a)
   {
    name = a;
    cout << "parmeteised const." << endl;
}

student(student &a)
{
    name = a.name;
    cout << "Copy const." << endl;
}

bool operator==(const student& a) const {
    if (a.name == this->name) return true;
    
    return false;
  }
};

int main()
{
   student a("Vyom");
   student c(a);
   if (a == c)
   {
       cout << "same";
   }
   return 0;
}

【讨论】:

  • @RemyLebeau 完成。感谢您的宝贵建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多