永发信息网

重载赋值运算符函数实现真正的字符串赋值,怎么个操作法?

答案:2  悬赏:20  手机版
解决时间 2021-05-07 19:11
重载赋值运算符函数实现真正的字符串赋值,怎么个操作法?
最佳答案
使程序更加简洁,减少编程时间,让自己容易理解。看下面一个表示string对象的类:// 一个很简单的string类class string ;string::string(const char *value) else }inline string::~string() 请注意这个类里没有声明赋值操作符和拷贝构造函数。这会带来一些不良后果。如果这样定义两个对象:string a("hello");string b("world");其结果就会如下所示:a: data——> "hello\0"b: data——> "world\0"对象a的内部是一个指向包含字符串"hello"的内存的指针,对象b的内部是一个指向包含字符串"world"的内存的指针。如果进行下面的赋值:b = a;因为没有自定义的operator=可以调用,c++会生成并调用一个缺省的operator=操作符(见条款45)。这个缺省的赋值操作符会执行从a的成员到b的成员的逐个成员的赋值操作,对指针(a.data和b.data) 来说就是逐位拷贝。赋值的结果如下所示:a: data --------> "hello\0" /b: data --/ "world\0"这种情况下至少有两个问题。第一,b曾指向的内存永远不会被删除,因而会永远丢失。这是产生内存泄漏的典型例子。第二,现在a和b包含的指针指向同一个字符串,那么只要其中一个离开了它的生存空间,其析构函数就会删除掉另一个指针还指向的那块内存。string a("hello"); // 定义并构造 a // 离开生存空间, 调用 // b的析构函数string c = a; // c.data 的值不能确定! // a.data 已被删除例子中最后一个语句调用了拷贝构造函数,因为它也没有在类中定义,c++以与处理赋值操作符一样的方式生成一个拷贝构造函数并执行相同的动作:对对象里的指针进行逐位拷贝。这会导致同样的问题,但不用担心内存泄漏,因为被初始化的对象还不能指向任何的内存。比如上面代码中的情形,当c.data用a.data的值来初始化时没有内存泄漏,因为c.data没指向任何地方。不过,假如c被a初始化后,c.data和a.data指向同一个地方,那这个地方会被删除两次:一次在c被摧毁时,另一次在a被摧毁时。
全部回答
1。自赋值判断,这是必须的,返回它本身,否则错误; 2。若不是自赋值,分配新的内存空间,并拷贝内存内容。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
新买的一个2G的内存用卟起?
电脑反映慢怎么办
DNF吉林1区,50粉矛 冰龙掩日矛多钱???
谁能给我一张有关情侣的图片啊,我要制作空间
爱神爱神在哪里视频,谁有《你爱神吗》这首基
求《植物人玩转网游》全集
2010年巴萨中国行。对国安的比赛几点开始打、
怎么才能把我的香烟戒掉????
急需关于教师节的画
金色琴弦中演艺人这首音乐出现在第几集?
我冒险岛已经建立了6个角色,暗影双刀出了之
后埔村民委员会这个地址在什么地方,我要处理
现在这个社会,一定要读书才有出路吗?
qq华夏点亮点亮了还会灭吗?
看望老伯伯 猜一称谓
推荐资讯
伊俪雅地址在什么地方,想过去办事
DNF流光腰、和青光震兽剑分别什么价钱?上海
水务大厦地上停车场地址在什么地方,想过去办
CS怎么和电脑对战
狂战士都学什么技能啊、俺不会是新手,请指教
QQ会员如何加速?
QQ华夏神道法师键盘怎么摆啊?
我的鸽子为何翅膀无力
白夷田我想知道这个在什么地方
6.28%换算成小数是多少???
为什么无法解除限制???
我的手机一直闪退打不开软件是什么原因
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?