重载赋值运算符函数实现真正的字符串赋值,怎么个操作法?
答案:2 悬赏:20 手机版
解决时间 2021-05-07 19:11
- 提问者网友:棒棒糖
- 2021-05-06 21:19
重载赋值运算符函数实现真正的字符串赋值,怎么个操作法?
最佳答案
- 五星知识达人网友:慢性怪人
- 2021-05-06 21:25
使程序更加简洁,减少编程时间,让自己容易理解。看下面一个表示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楼网友:一把行者刀
- 2021-05-06 21:30
1。自赋值判断,这是必须的,返回它本身,否则错误;
2。若不是自赋值,分配新的内存空间,并拷贝内存内容。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯