赋值运算符中返回值带const和不带const对象中有什么区别?

xiexiejohn 2021-02-27 05:37:22
重载赋值运算符时
1- const intlong &operator=(const intlong&)
2- intlong &operator=(const intlong&)
我开始以为第1个带const表示返回值不能被修改,只能做为常量返回,但测试时发现和第2个是一样,可以用于连续赋值
比如
intlong a(5);
intlong b(0);
intlong c(6);
a=b=c;
----那第1种返回值为const和第2种返回值不带const有什么区别?

还有
3- intlong &operator=(const intlong&)const;
4- intlong operator=(const intlong&)const;
这两种定义为const重载赋值运算符有什么作用?
----不能修改内部this成员这种赋值怎么改变左边值?,是不是说重载赋值运算符除了1和2有意义,3和4没意义

#include <iostream>
using namespace std;
class intlong{
friend ostream &operator<<(ostream&,const intlong&);
public:
intlong(int);
intlong(const intlong&);
intlong operator+(const intlong&)const;
const intlong &operator=(const intlong&); //前面加const
//intlong &operator=(const intlong&); //前面无const 无cons和有const怎么不能同时定义类中

private:
int p;

};


const intlong &intlong::operator=(const intlong& rhs){
this->p=rhs.p;
return *this;
}
/*
intlong &intlong::operator=(const intlong& rhs){
this->p=rhs.p;
return *this;
}*/

ostream &operator<<(ostream &cout,const intlong &rhs){
cout<<rhs.p<<endl;
return cout;
}

intlong::intlong(int rhs):p(rhs){
}
intlong::intlong(const intlong &rhs){
this->p=rhs.p;
}
intlong intlong::operator+(const intlong &rhs)const{
intlong temp(0);
temp.p=(*this).p + rhs.p ;
return temp;
}

int main()
{
intlong a(5);
intlong b(6);
intlong c(7);
a=b=c;

cout<<a<<endl;
return 0;
}
...全文
586 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2021-03-05
  • 打赏
  • 举报
回复
运算符名 语法 可重载 原型示例(对于 class T) 类内定义 类外定义 一元加 +a 是 T T::operator+() const; T operator+(const T &a); 一元减 -a 是 T T::operator-() const; T operator-(const T &a); 加法 a + b 是 T T::operator+(const T2 &b) const; T operator+(const T &a, const T2 &b); 减法 a - b 是 T T::operator-(const T2 &b) const; T operator-(const T &a, const T2 &b); 乘法 a * b 是 T T::operator*(const T2 &b) const; T operator*(const T &a, const T2 &b); 除法 a / b 是 T T::operator/(const T2 &b) const; T operator/(const T &a, const T2 &b); 模 a % b 是 T T::operator%(const T2 &b) const; T operator%(const T &a, const T2 &b); 逐位非 ~a 是 T T::operator~() const; T operator~(const T &a); 逐位与 a & b 是 T T::operator&(const T2 &b) const; T operator&(const T &a, const T2 &b); 逐位或 a | b 是 T T::operator|(const T2 &b) const; T operator|(const T &a, const T2 &b); 逐位异或 a ^ b 是 T T::operator^(const T2 &b) const; T operator^(const T &a, const T2 &b); 逐位左移 a << b 是 T T::operator<<(const T2 &b) const; T operator<<(const T &a, const T2 &b); 逐位右移 a >> b 是 T T::operator>>(const T2 &b) const; T operator>>(const T &a, const T2 &b); 注解 所有内建运算符都返回值,而大多数用户定义重载亦返回值,从而能以与内建版本相同的方式使用用户定义运算符。不过,用户定义重载中,任何类型都可以作为返回类型(包括 void)。特别是,operator<< 和 operator>> 为流插入和流抽取的重载所返回的是 T&。 T2 可以为包括 T 在内的任何类型。
luj_1768 2021-03-05
  • 打赏
  • 举报
回复
赋值号右侧(const)强制说明,主要与传递复制有关,在类派生中是比较重要的。
qq_41442872 2021-03-04
  • 打赏
  • 举报
回复
看不懂,学习中
快乐胖电工 2021-03-04
  • 打赏
  • 举报
回复
路过学习,顶
xiexiejohn 2021-03-03
  • 打赏
  • 举报
回复
引用 15 楼 真相重于对错 的回复:
返回值属于右值,自带const属性,一般很少把返回值修饰为const
多谢,等看完cpp教程再去看ec+v 暂时先这样理解 这样理解可以自圆其说
真相重于对错 2021-03-02
  • 打赏
  • 举报
回复
返回值属于右值,自带const属性,一般很少把返回值修饰为const
真相重于对错 2021-03-02
  • 打赏
  • 举报
回复
你的理解还有不少错误,比如+返回值而不是引用,手机打字不方便,建议看另外一本书,ec+v
xiexiejohn 2021-03-01
  • 打赏
  • 举报
回复
总结了下: 一:重载(算术运算符)比如+运算符有两种形式: 1- const intlong &operato+(const intlong&) 2- intlong &operator+(const intlong&) 第1种和第2种 共同点是都能进行加法运算 不同点是: 第1种最前面有个const 它用来修饰相加后的返回值,可以防止 intlong a,b,c; (a+b)=c; //第1种可以防止a+b当左值,阻止这种情况编译 第2种是允许(a+b)=c 这种情况,这是不符号逻辑的,因为到底c是赋值给a还是b呢?,或者说c赋值给a+b的临时值?都不适合 也就是所有重载算术运算符要选第1种,返回值都要修饰const 防止出现前面加法第一种情况 -------------------------------------------------------------- 二 重载赋值运算符: 3- const intlong &operato=(const intlong&) //返回值修饰为const 4- intlong &operator=(const intlong&) //返回值无const 3和4共同点是都可以连续赋值 intlong a,b,c; a=b=c; 不同点是 3:不可以 (a=b)=c;这样方式赋值 因为a=b的返回值被const修饰 已经无法用c来赋值 而且返回值的别名变成const对象(原对象不是const),此时 a=b返回是引用的别名,是const类型 如果点号可以调用const成员函数 比如 (a=b).show() show()必须是const成员函数 (a=b)调用是3 返回是const别名变量 并不是把a变成const而是把别名变成const类型, 注意a还是非const类型 4:可以 返回值是非const对象 也就是说一般重载赋值运算符都要选4这种方式 不能选3 免的使用时受到const对象规则限制 --------------------------------------------------------------- 三 重载[]运算符有三个版本,比如 5- int &operator[](int); //非const版本 返回数组元素 必须带引用 ,才能改变指定数组元素值 6- int operator[](int)const; //第1种 const版本的引用 返回值不带引用 表示返回临时值 7- const int &operator[](int)const; //第2个const版本 可以带引用,但是必须用const修饰返回值 6和7是const版本是给const对象调用的 后缀const表示禁止修改对象的成员数据,这里禁止也包括返回成员数据(就是说如果返回是成员数据 这个成员数据要么以非引用方式返回如6,要么以被const修饰后的引用方式返回如7)
xiexiejohn 2021-02-27
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
我还是那句话,不建议碎片化学习,最好系统的找一本书学一下,否则容易盲人摸象
多谢,在看cpp大学教程第五版这本书 就是在学过程中觉这样写和那样写都可以编译,有什么用这种疑问
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
如果这样的代码对的话, 那么 const int a=10; a=11; 这样的代码就应该对
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
const intlong d(8); d=a; 你觉得这样的代码对吗?
xiexiejohn 2021-02-27
  • 打赏
  • 举报
回复
引用 7 楼 真相重于对错 的回复:
赋值必然发生修改,所以34是错的
3和4可以编译通过 是对应const对象 比如 const intlong d(8); d=a; 这种情况 如果不提供3或4 将编译不过去,后来想了半天也想不出提供3和4 怎么修改d对象 觉的3和4好像没有意义
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
赋值必然发生修改,所以34是错的
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
我还是那句话,不建议碎片化学习,最好系统的找一本书学一下,否则容易盲人摸象
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
一样的。 int a=10; a=1;//这里是初始化还是赋值?? 其实你的问题不难,但是要你明白比较难,建议看一下ec++ 3,4,除非你不修改this,只要你一修改,就出错。
xiexiejohn 2021-02-27
  • 打赏
  • 举报
回复
引用 2 楼 真相重于对错 的回复:
T a=b这种情况下,不管b是不是const ,都会发生复制。 举个简单例子 int a=1; //这里的1明显是个const int 因为它是字面量,不可能被改写,执行这个语句后1这个数据就会被复制到a的存储单元里去了
可能不是这原因,int a=1 即使是 const int a=1 这是可以的,因为这是初始化不是赋值,记的书上有说过const是在初始化后才起作用。 1- const intlong &operator=(const intlong&) 2- intlong &operator=(const intlong&) 3- intlong &operator=(const intlong&)const; 4- intlong operator=(const intlong&)const; 我想问,是不是1和2重载赋值运算符才有意义,3和4虽然可以通过编译实际上并没什么用处
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
下面T operator=(..)const是错误的赋值操作符,因为赋值必然要修改,而const不允许修改,所以不对
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
T a=b这种情况下,不管b是不是const ,都会发生复制。 举个简单例子 int a=1; //这里的1明显是个const int 因为它是字面量,不可能被改写,执行这个语句后1这个数据就会被复制到a的存储单元里去了
真相重于对错 2021-02-27
  • 打赏
  • 举报
回复
返回值是右值,const 修饰右值没有任何意义

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧