通过类函数返回引用并返回 C++ 中的整个对象?

2024-01-18

Vector 类中的运算符重载:

CVector CVector::operator+ (CVector param) {
  CVector temp;
  temp.x = x + param.x;
  temp.y = y + param.y;
  return (temp);
}

并主要:

CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;

因此,一个对象是按值传递的,然后另一个临时对象被创建。我猜b是按值传递的,a是调用+的,因此x和y属于a,pram.x和param.y属于b。返回 temp 并且复制赋值运算符将 temp 的值传递给 c?

但是这个呢:

CVector& CVector::operator= (const CVector& param)
{
  x=param.x;
  y=param.y;
  return *this;
}

并主要:

a=b;

再次,a 正在调用 =,b 则作为 const 通过引用传递。(在这种情况下,如果它是按值传递,那么重要吗?)这就是我感到困惑的地方,属于 a 的 x 被分配了 be 的 param.x 。那么为什么这个函数不是 void,因为 x 和 y 可以通过这个函数访问。 return *this 意味着什么,我知道这是调用函数的对象的地址,所以 *this 将是函数本身,但是如果我们返回一个对象,我们需要将它分配给之前的 c=temp 之类的地方温度=a+b之后? CVector& 是什么意思,看起来我们并不期望 CVector 类型的对象的地址?

换句话说,为什么这个函数不只是:

void CVector::operator= (const CVector& param)
    {
      x=param.x;
      y=param.y;
    }

??

然后就有这段代码

#include <iostream> 
using namespace std;
 class Calc { 
private: 
  int value; 
public: 
  Calc(int value = 0) { this->value = value; } 
  Calc& Add(int x) { value += x; return *this; } 
  Calc& Sub(int x) { value -= x; return *this; } 
  Calc& Mult(int x) { value *= x; return *this; } 
  int GetValue() { return value; } }; 

int main() { 
  Calc cCalc(2); 
  cCalc.Add(5).Sub(3).Mult(4); 
  cout << cCalc.GetValue(); 
  return 0; 
}

现在,如果我从函数中删除 &:

  Calc Add(int x) { value += x; return *this; } 
  Calc Sub(int x) { value -= x; return *this; } 
  Calc Mult(int x) { value *= x; return *this; } 

并使用

Calc cCalc(2)
cCalc.Add(5);
cCalc.Sub(3);
cCalc.Mult(4);

而不是前者,它会产生相同的结果。 那么为什么 Calc 返回类型允许链接。

我不仅想知道如何编程,因为面向对象很大程度上是通过模式编写的(这是这样写的,如果需要的话),而不是必须使用逻辑的结构化编程,而且还想知道为什么是一个代码的和平定义,以及为什么它不像我直觉认为的那样(尽管我只学习了大约一年的编程)。

Thanks!


那么为什么这个函数不是 void,因为 x 和 y 可以通过这个函数访问。 return *这是什么意思

Since operator=()声明返回一个引用,return *this;返回对当前对象的引用。这允许我们链接赋值运算符。例如,

a = b = c;

将会通知b.operator=(c);并返回一个引用b. Then a由相当于的调用分配a.operator=(b).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过类函数返回引用并返回 C++ 中的整个对象? 的相关文章

随机推荐

  • 对 python 源文件中的类定义进行排序的最佳方法是什么?

    我有一个包含许多类定义的 py 源 如下所示 class C code c class A code a class B code b 我想把它变成 class A code a class B code b class C code c
  • 数字矩阵 javascript

    我需要 JS 中一个函数的帮助 该函数按给定整数 N 打印矩阵 如下所示 N 2 Matrix 1 2 2 3 N 3 Matrix 1 2 3 2 3 4 3 4 5 我需要用两个循环来完成 但我不知道如何做 function solve
  • 如何禁用 JSpinner 的键盘和鼠标输入?

    当我尝试使 JSpinner 无法通过键盘或鼠标编辑时 如下所示 DefaultEditor mySpinner getEditor getTextField setEditable false mySpinner setEnabled f
  • 我无法解决“为标识符注册的笔尖无效(BNRItemCell)”

    正在阅读 Big Nerd Ranch iOS 书 我在第二天尝试解决这个问题 我快要疯了 有人能帮忙吗 我收到以下错误消息 2014 06 20 11 37 18 764 Homepwner 10388 60b 由于未捕获的异常 NSIn
  • 当底层表发生变化时更新物化视图

    我有一个这样定义的物化视图 CREATE MATERIALIZED VIEW M FOO REFRESH COMPLETE ON COMMIT AS SELECT FOO ID BAR FROM FOO WHERE BAR IS NOT N
  • 是什么 ?关于常规变量?

    我在一些常规代码中看到了这样的内容 trip id encodeAsHTML 使用或不使用 id 有什么区别 它检查对象是否为空 使用它 可以防止空指针异常 如果您使用它 则应该将其用于整个对象 例如 trip id otherstuff
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • Django 和具有多个外键的模型

    我是 Django 的新手 到目前为止 它的功能给我留下了深刻的印象 我正在使用更复杂的模型 但无法正确使用它们 使用 Django 1 3 我尝试编写一个摘要页面 该页面将使用以下结构呈现下面的三个模型 换句话说 就是包含目的地和活动的旅
  • open_basedir 的影响和子域限制

    出于安全原因 我已将我的yiihtml 根目录下的文件夹 所以我的结构如下所示 conf httpdocs httpsdocs yii 运行该网站时 我收到错误 open basedir 限制yii php这是由index php out
  • AppBar Material UI 问题

    我对 Material UI 库还很陌生 但到目前为止我真的很喜欢它 但是 我遇到了 AppBar 组件覆盖在我的其他内容上的问题 我目前有
  • 维基百科上的汉字编码是什么?

    我在维基百科上查看中文字符的编码 但无法弄清楚它们正在使用什么 例如 的 被编码为 E7 9A 84 see here http upload wikimedia org wikipedia commons thumb a ae E7 9A
  • Maven - 检测同一依赖项的多个版本

    我刚刚经历了我的 Maven 项目的两个直接依赖项的情况 它们具有特定传递依赖项的两个不同版本 在我的特定情况下 我直接依赖于以下内容
  • 我可以将节点文本包装在 WinForms TreeView 中吗

    ASP NET TreeView 有一个 NodeWrap 属性 是否有在 WinForms TreeView 中完成相同操作的等效方法 EDIT 感谢您对其他控件的建议 不幸的是我的客户不允许使用第三方控件 这似乎不可能 您可能会寻找具有
  • CreateProcess 和奇怪的 nslookup 错误

    我有一个经常使用的 api 例程来捕获 dos 输出 最近发现了一个奇怪的错误 它似乎不允许 dns 调用 例如 nslookup 将返回 服务器无响应 错误 服务器 未知 如果您向其提供 IP 地址 Ping 将起作用 但如果它必须进行
  • Postgres-必须 to_timestamp() 忽略/不读取日期/时间字符串中间的特定字符

    我有原始文本列 其值类似于 2012 07 26T10 33 34 和 2012 07 26T10 56 16 在Java中使用Joda Time我可以通过调用轻松地将其转换为日期 从日期转换 new SimpleDateFormat yy
  • 当存在两种同名类型时,如何消除监视窗口中类型的歧义

    在监视窗口中 我试图查看TaskScheduler Current 但它向我显示以下错误 The type System Threading Tasks TaskScheduler exists in both CommonLanguage
  • 获取特定值的数组索引

    ArrayIndex Value Running total 0 6 6 1 1 7 2 6 13 3 2 15 I array index V value R Running total 例如 我需要为给定的运行总计选择适当的索引 12
  • Android 中的保留字列表

    我目前正在开发另一个 Android 应用程序的界面设计过程中 我似乎再次尝试使用资源的保留字 无论是可绘制对象还是布局 据我所知 您需要了解一组规则 不允许大写 除下划线外没有任何符号 没有数字 除了这些 如果我错了请纠正我 我think
  • 如何在 OSX Snow Leopard 10.6 上安装 perl DBD::Oracle

    我正在尝试从运行 OSX 10 6 雪豹的英特尔 Mac 连接到远程系统上的 Oracle 10 2 0 4 我尝试使用 perl CPAN 安装 DBD Oracle DBI 工作正常 但出现编译错误 有人可以提供一个易于遵循的指南吗 在
  • 通过类函数返回引用并返回 C++ 中的整个对象?

    Vector 类中的运算符重载 CVector CVector operator CVector param CVector temp temp x x param x temp y y param y return temp 并主要 CV