ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

经典问题解析三

2021-11-28 21:59:58  阅读:106  来源: 互联网

标签:const string 问题 操作符 经典 Test 拷贝 解析 赋值


关于赋值的疑问:
什么时候需要重载赋值操作符?
编译器是否提供默认的赋值操作符?
答案:(1)编译器为每个类默认重载了赋值操作符
(2)默认的赋值操作符仅完成浅拷贝
(3)当需要进行深拷贝时必须重载赋值操作符 //赋值时携带外部资源时,需要深拷贝
(4**)赋值操作符与拷贝构造函数有相同的存在意义**
一般性原则:
重置复制操作符,必然需要实现深拷贝

编程实验:默认赋值操作符重载

编程实验:编程实验:数组类的优化

编译器默认提供的函数:
下面两个类等价

class Test
{

};
class Test
{
public:
    Test();
    Test(const Test&);
    Test& operator= (const Test&);
    ~Test();
};

下面代码输出什么?为什么?
string对象内部维护了一个指向数据的char*指针,这个指针可能在程序运行的过程中发生改变。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s = "098765";   //string对象内部维护了一个指向数据的char*指针,这个指针可能在程序运行的过程中发生改变。
    const char* p = s.c_str();

    cout << p << endl;

    s.append("abcd");  //string对象内部维护了一个指向数据的char*指针发生改变

    cout << p << endl;  //此时p为野指针

    return 0;
}

在这里插入图片描述
下面的程序输出什么?为什么?

#include <iostream>
#include <string>

using namespace std;

int main()
{
    const char* p = "12345"; //const string p = "12345";

    string s = "";

    s.reserve(100);

    for(int i = 0; i < 5; i++)  //s = p;
    {
        s[i] = p[i];
    }

    if(!s.empty())
    {
        cout << s << endl;
    }

    for(int i = 0; i < 5; i++)
    { 
        cout << s[i] << endl;
    }

    cout << s << endl;

    return 0;
}

小结:
(1)string类通过一个数据空间保存字符数据
(2)string类通过一个成员变量保存当前字符串的长度
(3)C++开发时尽量避免C语言中惯用的编程思想

标签:const,string,问题,操作符,经典,Test,拷贝,解析,赋值
来源: https://blog.csdn.net/weixin_46571142/article/details/121597198

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有