Slide2.PNG

关于赋值的疑问

编译器为每个类默认重载了赋值操作符

默认的赋值操作符仅完成浅拷贝

当需要进行深拷贝时必须重载赋值操作符

赋值操作符与拷贝构造函数具有相同的存在意义

#include <iostream>
#include <string>

using namespace std;

class Test
{
    int* m_pointer;
public:
    Test()
    {
        m_pointer = NULL;
    }
    Test(int i)
    {
        m_pointer = new int(i);
    }
    Test(const Test& obj)
    {
        m_pointer = new int(*obj.m_pointer);
    }
    Test& operator = (const Test& obj)
    {
        if( this != &obj )
        {
            delete m_pointer;
            m_pointer = new int(*obj.m_pointer);
        }
        
        return *this;
    }
    void print()
    {
        cout << "m_pointer = " << hex << m_pointer << endl;
    }
    ~Test()
    {
        delete m_pointer;
    }
};

int main()
{
    Test t1 = 1;
    Test t2;
    
    t2 = t1;
    
    t1.print();
    t2.print();
    
    return 0;
}

输出:

m_pointer = 0x8be6008
m_pointer = 0x8be6018

Slide8.PNG

例子:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s= "123456";
    const char *p = s.c_str();
    cout << s << endl;
    s.append("abced");
    cout << s <<endl;    //p成为野指针
    
    return 0;
}
123456
123456abced

Slide12.PNG

#include <iostream>
#include <string>

using namespace std;

int main()
{
    const char* p = "12345";
    string s = "";
        
    s.reserve(10);
    
    // 不要使用 C 语言中的方式操作 C++ 中的字符串
    for(int i=0; i<5; i++)
    {
        s[i] = p[i];
    }
        
    cout << s << endl;
    
    return 0;
}

输出:


解决办法:
例:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    const string p = "12345";
    string s = "";
        
     s = p;
        
    cout << s << endl;
    
    return 0;
}

输出:
12345

小结:

需要进行深拷贝的时候必须重载赋值运算符

赋值运算符和拷贝构造函数具有同等重要意义

string类通过一个数据空间保存字符数据

string类通过一个成员变量保存到当前字符串的长度

C++开发时尽量避开C语言的编程思想


YingLi
6 声望4 粉丝

From zero to hero.