c++复制控制问题
c++ copy control issue
#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;
现在h
和h2
指向x
。您可以检查该输出由指针指向的对象。例如
std::cout << "*h = " << *h << ", *h2 = " << *h2 << std::endl;
那么你正在使用第三个指针
int *h3 = &y;
h2 = h3;
现在h2
和h3
指向y
。h
未更改。你也可以检查
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
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 2WD蓝牙控制的汽车的问题无法停止
- 调整TAB大小控制闪烁问题
- 在API中控制WNDProc功能的问题
- 自旋控制位置问题(Windows)
- Arduino以太网访问控制问题
- 控制达到非空功能结束.我该如何解决这个问题
- 游戏循环帧速率控制问题
- 如何在编译C++代码时解决一些版本控制问题
- C++STL版本控制问题+Boost
- 避免DLL版本控制问题
- Windows Media Player远程控制问题
- 在这段代码中,我有一个警告:控制达到非void函数的结束[- return-type].我怎样才能解决这个问题
- c++复制控制问题
- gcc的Bug?模板类中友元函数的访问控制问题