首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请教一个引用类的有关问题

2012-08-14 
请问一个引用类的问题?C/C++ code//引用类class Ref{public:Ref(void) : m_nRef(1) {}~Ref(void){}private

请问一个引用类的问题?

C/C++ code
//引用类class Ref{public:    Ref(void) : m_nRef(1) {}    ~Ref(void){}private:    int m_nRef;public:    int AddRef()    {        m_nRef++;        return m_nRef;    }    int Release()    {        m_nRef--;        return m_nRef;    }};//测试类class test{public:    test(void);    ~test(void);public:    Ref *m_pRef;    void operator = (const test & testx)    {        if (m_pRef)            delete m_pRef;        m_pRef = testx.m_pRef;        m_pRef->AddRef();    }};test::test(void){    m_pRef = new Ref;}test::~test(void){    if (m_pRef->Release() == 0)    {        delete m_pRef;    }}


请问一个问题:
test test1;
test test2 = test1; //这里并不会调用 = 重定义操作
  test test3 = test2;
m_pRef 的值一直是1,但是当退出程序运行区域的,test1, test2, test3依次施放资源。
请问下如何控制这种情况影响对象的引用次数?

[解决办法]
C/C++ code
test& operator = (const test & testx)    {        if (m_pRef)//没看明白你的逻辑,这里为什么要delete?            delete m_pRef;        m_pRef = testx.m_pRef;//既然前面已经delete了,而这里却对一个已经释放了内存空间的对象进行赋值。        m_pRef->AddRef();    }
[解决办法]
test test2 = test1; //这里并不会调用 = 重定义操作

是的,这里会调用拷贝构造函数,所以你需要在拷贝构造函数里面对引用次数做相应的处理。
[解决办法]
test test2 = test1; 

这是要调用复制构造函数。因为私有成员有个指针,要深度复制。
[解决办法]
但是已经delete了啊 还怎么深度复制呢?
[解决办法]
void operator = (const test & testx)
有问题啊, 怎么返回void?
test& operator=(const test& testx)
[解决办法]
=操作符重载都写成这样还觉得自己没错,那你还问什么问题呢?
探讨

引用:

void operator = (const test & testx)
有问题啊, 怎么返回void?
test& operator=(const test& testx)

那个是复制后返回值,你不会值,对你复制又没有任何影响呀?

热点排行