- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
问题
(1)关于=的重载
当我要用友元函数重载=时,编译器提示我无法重载=,所以我想问一下,=真的无法被重载为友元函数吗?
(2)赋值运算符无法重载为友元函数
在做第6次作业第2题时,发现赋值函数无法重载为友元函数,编译器提示:
……operator=(……)mustbenon-staticmemberfunctionofString。
网上查了说什么重载为友元函数后,编译器无法判定到底是调用默认合成的赋值函数还是用户编辑的友元函数。还和什么类型自动转换有关。到底是怎么回事啊?
答:完全可能!重载有种种限制,你只把+,+=重载为友元函数即可。
赋值=的情况确实很复杂,存在类型自动转换的问题。
====================================================================
2.“=”重载中自赋值的判断
我觉得=重载中只需要对自赋值的情况做一个判断,(this!=str)为真时,再执行赋值操作,这样是不是就可以避免自赋值中因为释放内存而引起的崩溃?
另外,在win8.1x64+vs2013环境下,编译时有时会出现“cl.exe已退出,代码为2”、“link.exe已退出”、“无法找到rc.exe”、“无法执行cvtres.exe等莫名其妙的错误,csdn上有网友解释说这种现象可能和环境变量或者杀毒软件有关,但是我检查过环境变量,卸载杀毒软件后问题仍然存在。部分使用win7x64+vs2012的同学也有此类现象。在虚拟机win8.1x86+vs2013中则无此现象。不知道是什么问题?
答:你的建议,判断(this!=str)是可以的,但这不一定能解决所有问题,除了s=s之外,还会有意想不到的写法。
这个问题很难一言以蔽之,得视程序的情况而定,确实跟编译环境有关,但也可能是你的程序在打“擦边球”。
====================================================================
3.为何operator=不能被重载为友元函数呢?
答:[]、()、-、=这几个运算符如果要重载,必须重载为成员函数而不能重载为友元。并且C++规定赋值运算符“=”只能重载为类的非静态成员函数,而不可以重载为类的友元函数。
(声明:下面的程序和文字是从网上下载的,只是一家之言,不是“=只能重载为类的非静态成员函数”这一问题的全部原因。)
看一测试程序:
#includeiostream
usingnamespacestd;
classA
{
private:
intx;
public:
A(){x=99;}
A(intxx)
{coutCallA(intxx)x=xx;
}
};
intmain()
{Aa;
a=7;
}
程序执行结果为:
CallA(intxx)
说明执行a=7这程序语句时,程序去调用类A中的带参数的构造函数。
在类A中加入赋值运算重载成员函数,如下:
#includeiostream
usingnamespacestd;
classA
{
private:
intx;
public:
A(){x=99;}
A(intxx)
{coutCallA(intxx)x=xx;
}
Aoperator=(intxx)//重载赋值运算符运算
{coutCallAoperator=(intxx)x=xx;
return*this;
}
};
intmain()
{Aa;
a=7;
}
程序运行结果:
CallAoperator=(intxx)
说明在类A中已经有相应赋值运算符重载函数的时候,执行赋值语句a=7;程序会去调用类A中相应的赋值运算符重载函数,而不会像上面原来那样去调用有参数的构造函数。
在此,我们可以对C++规则做出以下的判断:
当类中没有定义赋值运算符重载成员函数时(注意,在未定义形参数据类型为该类类型的赋值运算符重载函数时,编译器会自动生成加入),当程序执行到某一赋值语句时,程序就会调用与赋值语句中右值类型(指=右侧的类型)匹配的构造函数,
文档评论(0)