问个狂野的问题

zzunicholas 2006-12-13 10:48:49
把句柄放在类里可以保护和关联信息

为了防止构造,我们在参数中使用对象的引用

但是
在返回一个对象的时候,还要调用构造函数,这是一定了
但是一般构造函数都是创建句柄,然后拷贝句柄

可是作为返回的对象,其句柄就要释放何必重建和拷贝
直接把它给返回的对象关联不就行了,避免释放和重建的过程

但是,对象可不可以知道自己是用做返回的呢?
...全文
283 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzunicholas 2006-12-16
  • 打赏
  • 举报
回复
我只好加了个公有成员
QQ_370566617 2006-12-13
  • 打赏
  • 举报
回复
开玩笑,

怎么区分:
obj2 = obj1;//要副本

obj2 = returnobj();//不要不用副本

引用计数只能保证所有权统一
副本怎么吧?

taodm 2006-12-13
  • 打赏
  • 举报
回复
汗,你要能写成CMatrix<T>::CMatrix(CMatrix<T> m)而编译通过就算你狠。
你的程序其实是一个所有权转移、传递问题。
可以参看C++的auto_ptr的设计。
用 CMatrix<T>::CMatrix(CMatrix<T> & m)
CMatrix<T> & CMatrix<T>::operator =(CMatrix<T> & m)
在函数内部修改m的状态,让它知道自己已经被剥夺了所有权,以取消在析构函数里的动作。
QQ_370566617 2006-12-13
  • 打赏
  • 举报
回复
嗯,

这个对象自己很难知道,

因为表面上是返回对象然后退出函数
如果你setp into一下,
你会发现是先返回进行构造然后返回对象析构自己

但是楼上的楼上说的引用计数这个...
返回对象还没析构
zzunicholas 2006-12-13
  • 打赏
  • 举报
回复
我来解释一下

template<typename T>
CMatrix<T>::CMatrix(const CMatrix<T> & m)//采用引用作参数通常可以避免生成临时的对象也就是我说的避免了构造和析构
:_pCS(m._pCS),m_bReturn(false)//copy constructor
{
m_nHeight=m.m_nHeight;
m_nWidth=m.m_nWidth;

m_pData=new T[m_nHeight*m_nWidth];
memcpy(m_pData,m.m_pData,m_nHeight*m_nWidth*sizeof(T));
//通过对象构造是这样的创建内存,拷贝过来

}

重载=和我上面的拷贝复制问题一样
template<typename T>
CMatrix<T> & CMatrix<T>::operator =(CMatrix<T> & m)
{
if(&m==this) return *this;

m_nHeight=m.m_nHeight;
m_nWidth=m.m_nWidth;
if(m_pData)
{
delete [] m_pData;
m_pData = NULL;
}

m_pData=new T[m_nHeight*m_nWidth];
memcpy(m_pData,m.m_pData,m_nHeight*m_nWidth*sizeof(T));

return *this;
}

我要说的是如果对象知道是返回的
那么m_pData = m.m_pData;
当然返回的对象在析构的时候不能释放内存,要跳过去才行

前提是对象要知道自己将被返回
Wolf0403 2006-12-13
  • 打赏
  • 举报
回复
ref-counting...
taodm 2006-12-13
  • 打赏
  • 举报
回复
“为了防止构造,我们在参数中使用对象的引用”不知所云。请代码示例。

“但是一般构造函数都是创建句柄,然后拷贝句柄”,还是不知道你想说啥,请代码示例。

对象没法知道自己正在用做函数返回值,但是有办法知道自己携带的信息是不是被别人处理过。

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧