- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当 main() 调用具有某种数据类型(原始或用户定义)返回值的函数时,调用该函数的语句“通常”是一个赋值。
例如:-
class complex
{
private:
int real;
int imag;
public:
complex();
complex(int r,int i);
complex operator + (complex c);
};
假设,我重载的“+”的定义是这样的-
complex complex::operator + (complex c)
{
this->real = this->real + c.real;
this->imag = this->imag + c.imag;
return *this;
}
我的主要功能如下-
int main()
{
complex c1;
complex c2(5,4);
c1+c2;
}
在上面的 main() 中,考虑语句 c1+c2 。编译器将其视为 c1.operator + (c2) 。当 main 调用此函数时,它会向 main() 返回一个值。这个返回值会发生什么??
最佳答案
表达式 c1+c2
的值被您的代码忽略,因为您没有将它存储在任何地方。最多,编译器会打印一些警告信息。要禁止此类警告消息,您可以编写:
(void)(c1+c2); //casting to void suppresses the warning messages!
看这个:
但是,在您的代码中,operator+
的实现在语义上不正确。要了解这一点,请考虑这一点,
int a=10;
int b=5;
那么,你希望a+b
改变a
的值吗? a
应该变成 15
吗?没有。
如果你想要那个,那么你可以写成a+=b
。但在您的代码中,c1+c2
的行为等同于 c1+=c2
的语义,因为您正在更新 this->real
的值> 和 this->imag
在您的 operator+
实现中,这在语义上是不正确的。
所以第一个修复是这样的:
complex complex::operator + (const complex& c) const
{
complex result(c); //make a copy of c
result.real += this->real; //add
result.imag += this->imag; //add
return result;
}
现在,这在语义上是正确的。
也就是说,还有一些事情需要注意。当您编写c1+c2
时,您是否认为操作+
应用于其中一个对象?不,它不适用于它们中的任何一个,但是成员函数 operator+
在 c1
对象上被调用,该对象成为函数内部的 this
指针.如果操作不适用于它,为什么要在 c1
(或者就此而言 c2
)上调用它?
这个分析清楚地表明 operator+
不应该是类的成员函数。它应该是一个非成员函数,然后签名将是:
complex operator+(const complex &a, const complex &b);
但是有个小问题:在a+b
的计算中,需要访问类的私有(private)成员(real
和imag
是私有(private)成员)。所以解决方案是,operator+
应该根据operator+=
来实现,后者应该作为成员函数添加到类中, 因为表达式 a+=b
中的操作 +=
确实适用于 a
,因为它修改了它的值。
所以这是我对这两个运算符的实现:
class complex
{
//...
public:
//member function
complex& operator+=(const complex & c)
{
real += c.real; //same as: this->real+=c.real; this is implicit
imag += c.imag; //same as: this->imag+=c.real; this is implicit
return *this;
}
};
//non-member function (its non-friend as well)
complex operator+(const complex &a, const complex &b)
{
complex result(a); //make copy of a by invoking the copy-constructor
result += b; //invokes operator+
return result;
}
或者您可以加入最后两个语句:
complex operator+(const complex &a, const complex &b)
{
complex result(a); //make copy of a by invoking the copy-constructor
return result += b; //invokes operator+, and then return updated 'result'
}
但是还有另一种复制方式。为什么要通过引用传递这两个参数?按值传递第一个参数将生成我们需要的拷贝。所以更好的实现是这样的:
complex operator+(complex a, const complex &b)
{ //^^^^^^^^^ pass-by-value
a += b; //a is a copy, after all - we can modify it!
return a;
}
希望对您有所帮助。
关于c++ - 具有返回值的函数 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7376554/
这是代码片段。 请说出这种用小内存存储大数据的算法是什么。 public static void main(String[] args) { long longValue = 21474836
所以我使用 imap 从 gmail 和 outlook 接收电子邮件。 Gmail 像这样编码 =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpb
很久以前就学会了 C 代码;想用 Scheme 尝试一些新的和不同的东西。我正在尝试制作一个接受两个参数并返回两者中较大者的过程,例如 (define (larger x y) (if (> x
Azure 恢复服务保管库有两个备份配置选项 - LRS 与 GRS 这是一个有关 Azure 恢复服务保管库的问题。 当其驻留区域发生故障时,如何处理启用异地冗余的恢复服务保管库?如果未为恢复服务启
说,我有以下实体: @Entity public class A { @Id @GeneratedValue private Long id; @Embedded private
我有下一个问题。 我有下一个标准: criteria.add(Restrictions.in("entity.otherEntity", getOtherEntitiesList())); 如果我的
如果这是任何类型的重复,我会提前申请,但我找不到任何可以解决我的具体问题的内容。 这是我的程序: import java.util.Random; public class CarnivalGame{
我目前正在使用golang创建一个聚合管道,在其中使用“$ or”运算符查询文档。 结果是一堆需要分组的未分组文档,这样我就可以进入下一阶段,找到两个数据集之间的交集。 然后将其用于在单独的集合中进行
是否可以在正则表达式中创建 OR 条件。 我正在尝试查找包含此类模式的文件名列表的匹配项 第一个案例 xxxxx-hello.file 或者案例二 xxxx-hello-unasigned.file
该程序只是在用户输入行数时创建菱形的形状,因此它有 6 个 for 循环; 3 个循环创建第一个三角形,3 个循环创建另一个三角形,通过这 2 个三角形和 6 个循环,我们得到了一个菱形,这是整个程序
我有一个像这样的查询字符串 www.google.com?Department=Education & Finance&Department=Health 我有这些 li 标签,它们的查询字符串是这样
我有一个带有静态构造函数的类,我用它来读取 app.config 值。如何使用不同的配置值对类进行单元测试。我正在考虑在不同的应用程序域中运行每个测试,这样我就可以为每个测试执行静态构造函数 - 但我
我正在寻找一个可以容纳多个键的容器,如果我为其中一个键值输入保留值(例如 0),它会被视为“或”搜索。 map, int > myContainer; myContainer.insert(make_
我正在为 Web 应用程序创建数据库,并正在寻找一些建议来对可能具有多种类型的单个实体进行建模,每种类型具有不同的属性。 作为示例,假设我想为“数据源”对象创建一个关系模型。所有数据源都会有一些共享属
(1) =>CREATE TABLE T1(id BIGSERIAL PRIMARY KEY, name TEXT); CREATE TABLE (2) =>INSERT INTO T1 (name)
我不确定在使用别名时如何解决不明确的列引用。 假设有两个表,a 和 b,它们都有一个 name 列。如果我加入这两个表并为结果添加别名,我不知道如何为这两个表引用 name 列。我已经尝试了一些变体,
我的查询是: select * from table where id IN (1,5,4,3,2) 我想要的与这个顺序完全相同,不是从1...5,而是从1,5,4,3,2。我怎样才能做到这一点? 最
我正在使用 C# 代码执行动态生成的 MySQL 查询。抛出异常: CREATE TABLE dump ("@employee_OID" VARCHAR(50)); "{"You have an er
我有日期 2016-03-30T23:59:59.000000+0000。我可以知道它的格式是什么吗?因为如果我使用 yyyy-MM-dd'T'HH:mm:ss.SSS,它会抛出异常 最佳答案 Sim
我有一个示例模式,它的 SQL Fiddle 如下: http://sqlfiddle.com/#!2/6816b/2 这个 fiddle 只是根据 where 子句中的条件查询示例数据库,如下所示:
我是一名优秀的程序员,十分优秀!