c++复制控制问题

c++ copy control issue

本文关键字:问题 控制 复制 c++      更新时间:2023-10-16
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class HasPtr{
 public:
    //constructor accepts a string
    HasPtr(const string &s = string()) : ps(new string(s)), i(0), use(new size_t(1)) {}  
    //copy constructor
    HasPtr(const HasPtr &h) : ps(h.ps), i(h.i), use(h.use) { ++*use; }
    //copy assignment operator 
    HasPtr &operator=(const HasPtr &h)
    {
        ++*h.use;
        if(--*use == 0)
        {
            delete ps;
            delete use;
        }
        ps = h.ps;
        i = h.i;
        use = h.use;
        return *this;
    }
    ~HasPtr()
    {
        if(--*use == 0)
        {
            delete ps;
            delete use;
        }
    }
//private:
    string *ps;
    int i;
    size_t *use;
};

int main()
{
    HasPtr h("hi mom");
    HasPtr h2 = h;
    HasPtr h3("hi dad");
    h2 = h3;
    cout << "h: " << *h.ps << endl;
    cout << "h2: " << *h2.ps << endl;
    cout << "h3: " << *h3.ps << endl;
}

输出为:

h: hi mom
h2: hi dad
h3: hi dad

我认为输出应该是:

h: hi dad
h2: hi dad
h3: hi dad

我认为输出应该像上面那样的原因:

h是"嗨妈妈",h2共享h1,所以h2是"嗨妈妈",h3是"嗨爸爸",我认为h2 = h3改变了h1,因为h2共享h1,但它不是。

我做错了什么?

事情是这样的:

HasPtr h("hi mom");
HasPtr h2 = h;
h.ps ---> "hi mom"  <--- h2.ps

下一个语句,你改变h2,但不影响h:

HasPtr h3("hi dad");
h2 = h3;
h2.ps ----> "hi dad" <--- h3.ps
 |
XXX changed
 |
"hi mom" <--- h.ps

指针是指向同一地址的不同实例。例子:

int a = 5, c = 1; 
int *p1 = &a, *p2 = &a;

改变p1(即p1 = &c)不会影响p2

为了更清楚,让我们考虑一个简化的例子

int x = 10;
int y = 20;
int *h = &x;
int *h2 = h;

现在hh2指向x。您可以检查该输出由指针指向的对象。例如

std::cout << "*h = " << *h << ", *h2 = " << *h2 << std::endl;

那么你正在使用第三个指针

int *h3 = &y;
h2 = h3;

现在h2h3指向yh未更改。你也可以检查

std::cout << "*h2 = " << *h2 << ", *h3 = " << *h3 << std::endl;
std::cout << "*h = " << *h << std::endl;

语句中的对象也是如此

HasPtr h("hi mom");
HasPtr h2 = h;
HasPtr h3("hi dad");
h2 = h3;

只有对应的指针(ps)被包装在类的对象中。

下面是一个演示解释的程序

#include <iostream>
#include <string>

int main()
{
    std::string hi_mom( "hi mom" );
    std::string hi_dad( "hi dad" );
    std::string *h  = &hi_mom;
    std::string *h2 = h;
    std::cout << "*h = " << *h << ", *h2 = " << *h2 << std::endl;
    std::string *h3 = &hi_dad;
    h2 = h3;
    std::cout << "*h2 = " << *h2 << ", *h3 = " << *h3 << std::endl;
    std::cout << "*h = " << *h << std::endl;
}        

输出为

*h = hi mom, *h2 = hi mom
*h2 = hi dad, *h3 = hi dad
*h = hi mom