C++ operator=的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ operator=的问题相关的知识,希望对你有一定的参考价值。

这一张是教材上的代码
这一张是我的代码
#include <iostream>
using namespace std;
class num

public:
num()x=new int;*x=1;
num(int i)x=new int;*x=i;cout<<"构造函数\n";
num(const num &s)x=new int;*x=s.get();cout<<"复制构造函数\n";
~num()delete x;x=NULL;cout<<"析构函数\n";
void set(int i)*x=i;
int get()constreturn *x;
//const num &operator++()++x;return *this;
//const num operator++(int o)num temp(*this);++x;return temp;
//num add(num&r)return num(*x+r.get());
// num operator+(num&r)return num(*x+r.get());
num equal( num&r)*x=r.get();return *this;
operator=(const num&r)*x=r.get();

private:
int *x;
;
int main()

num one(1),two(2);
num three=one.equal(two);//equal中返回的this指针的作用
cout<<three.get()<<endl;
one=two;
cout<<one.get()<<endl;
return 0;


operator=(const num&r)*x=r.get(); 为何出错? 我把这个一行改成 num operator=(const num&r)*x=r.get();return *this;就可以正常使用了。
本人大菜鸟一个,求大神指点一下!
补充一下,第一张图片是教材代码,第二张图片是我自己打的代码,第三部分就是这个代码。

参考技术A 这里涉及到拷贝构造函数调用get()函数的参数匹配问题。
在拷贝构造函数中,形参是 const num &r,就是说,形参由const修饰,但当调用get()函数时,由于没有显式声明该函数不修改参数的值(事实上也不修改),编译程序认为,用const形参调用非const形参函数时,不能保证get()不修改参数的值,所以发出错误信息,修改方法很简单,只需将get()函数声明为int get()const即可。

第17行没有给出返回值类型,在C中,编译程序会假定为默认的int类型,但在C++中没有这样的默认,所以出错。
这个函数是赋值运算符=重载,应该是这样的:
num &operator=(const num *r) *x = r.get(); return *thiis;追问

哎,最后还是自己弄明白了,根本就不是CONST的问题,而是浅拷贝与深层拷贝的问题。

本回答被提问者采纳

“operator !=”是不是应该在 C++ 中始终通过“operator ==”来实现?

【中文标题】“operator !=”是不是应该在 C++ 中始终通过“operator ==”来实现?【英文标题】:Should "operator !=" always be implemented via "operator ==" in C++?“operator !=”是否应该在 C++ 中始终通过“operator ==”来实现? 【发布时间】:2011-06-07 17:44:13 【问题描述】:

我目前正在查看一个旧的 C++ 代码库,发现很多代码是这样的:

bool SomeClass::operator==( const SomeClass& other ) const

   return member1 == other.member1 && member2 == other.member2;


bool SomeClass::operator!=( const SomeClass& other ) const

   return member1 != other.member1 || member2 != other.member2;

很明显,比较逻辑是重复的,上面的代码可能需要在两个地方而不是一个地方进行更改。

AFAIK 实现operator!= 的典型方式是这样的:

bool SomeClass::operator!=( const SomeClass& other ) const

    return !( *this == other );

在后一种情况下,无论operator== 发生什么逻辑变化,它都会自动反映在operator!= 中,因为它只是调用operator== 并执行否定。

除了在 C++ 代码中重用 operator== 之外,是否应该以任何其他方式实现 operator!=

【问题讨论】:

同样,应该尝试以最少冗余的方式实现&gt;, &gt;=, &lt;=, &lt; 运算符。 规则不应该是绝对的。所有规则普遍适用。但我相信总会有特定的情况,他们没有。但是想出一个(除非你昨天碰巧做到了)通常是不可能的(因为它们是规则的例外)。就像问的都是白天鹅。是的,所有天鹅都是白色的(直到 1500 年在澳大利亚发现黑天鹅)。 Ceaser: "rara avis in terris nigroque simillima cygno" 【参考方案1】:

恕我直言,在 == 方面实现 != 既合理又可靠。 (或相反)

【讨论】:

-1 表示错误的建议.. 你如何根据!= 实现== @Nawaz:a==b iff !(a!=b)。这是根据定义。【参考方案2】:

语义上是的(意味着 == 应该是 != 的逻辑补充),但实际上(编码)你不必这样做。

【讨论】:

我会在语义上说你不需要,但实际上你应该 我的意思是 == 应该是 != 的语义补充,但实际上(在编程中)你不必用它来暗示否定。 你没有错或任何事情:)。只是看待事物的方式不同。当您说“实际”时,您关注的是 C++ 的规则,当我说“实际”时,我关注的是易于维护的模块化代码。不要过多阅读我的评论:)【参考方案3】:

在大多数情况下a!=b 的语义应该等于!(a==b)

对于所有其他运算符也是如此:a&lt;b 应该等于 !(a=&gt;b)!(a==b || a&gt;b)a&lt;=b &amp;&amp; !(a==b) 等等。

为此,boost.operators 提供了一些很棒的工具,可以根据其他工具自动生成运算符。


但是,当您为运算符提供一些特定语义时(即:您不使用 == 来检查两个项目是否相同,而是使用 STL 对 &gt;&gt;&lt;&lt; 进行一些花哨的操作) 你可能想给他们不同的实现。

通常不建议这种做法,尽管即使是 STL 和许多 boost 库也这样做。


编辑 - 一点补充:

到目前为止,我所说的仅涉及运算符的语义。如果你决定 a!=b 的语义应该是 !(a==b) 你有两种方法来实现它:

通过调用另一个运算符,如果您使用 boost.operators 会发生这种情况:bool operator!=(a,b) return !(a==b);

从头开始实现它们。

第一种方法通常更容易实现且更安全。可以证明第二个选项的最常见的事情是优化,尽管它可能不值得:现代编译器在大多数情况下不会增加任何开销(如果你查看 boost.operators 源代码,你会看到许多关于它们如何依靠NRVO 不会增加任何开销,或者如果编译器不提供 NRVO,它们的代码会如何变化)。

无论如何,无论您选择什么选项,它都不会对您的应用程序逻辑产生影响,因为重要的是语义(即:您的运算符的行为方式,它们为任何可能的输入返回什么)。

【讨论】:

+1 for Boost.Operators,令人惊讶的是,这个微型库如何让实现运算符变得如此简单。不仅您摆脱了依赖关系,而且您还摆脱了明显的错误(例如,在实现 &lt;= 时切换参数为 &lt;)。【参考方案4】:

除了在 C++ 代码中重用 operator== 之外,是否应该以任何其他方式实现 operator!=

我不这么认为。但同样适用于其他代码,例如后缀++ 应该总是 以前缀++ 的形式实现(当然对于优化器可以生成更高效代码的原生类型除外,但我相信即使这样,参数仍然成立)和@987654325 @ 应该几乎总是按照operator += 来实现(例外是当您使用代理对象来延迟执行时)。

这就是std::relops 存在的原因。

【讨论】:

以上是关于C++ operator=的问题的主要内容,如果未能解决你的问题,请参考以下文章

C++,关于operator的详细总解,(原理和用法)

C++中operator用法

c++ new operator和operator new,delete operator和operator delete

为 c++ 类重载 operator+。

C++内存管理(new operator/operator new/operator delete/placement new)

c++ operator 的CONST应用