什么时候用指针调用C++类构造函数

When is C++ Class Constructor called with pointer?

本文关键字:构造函数 C++ 调用 指针 什么时候      更新时间:2023-10-16

我对c++没有深入的了解
我已经实现了智能指针,以防止由原始指针引起的问题。(内存泄漏(
下面是智能指针的代码。

#ifndef SMARTPOINTER
#define SMARTPOINTER
class RC
{
private:
int count; // Reference count
public:
RC(){            count = 0;        }
void AddRef()
{
// Increment the reference count
count++;
}
int Release()
{
// Decrement the reference count and
// return the reference count.
if(count==0) return 0;
return --count;
}
};
template < typename T > class SP
{
private:
T*    pData;       // pointer
RC* reference; // Reference count
public:
SP() : pData(0), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(T* pValue) : pData(pValue), reference(0)
{
// Create a new reference
reference = new RC();
// Increment the reference count
reference->AddRef();
}
SP(const SP<T>& sp) : pData(sp.pData), reference(sp.reference)
{
// Copy constructor
// Copy the data and reference pointer
// and increment the reference count
reference->AddRef();
}
~SP()
{
// Destructor
// Decrement the reference count
// if reference become zero delete the data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
}
T& operator* ()
{
return *pData;
}
T* operator-> ()
{
return pData;
}
SP<T>& operator = (const SP<T>& sp)
{
// Assignment operator
if (this != &sp) // Avoid self assignment
{
// Decrement the old reference count
// if reference become zero delete the old data
if(reference->Release() == 0)
{
delete pData;
delete reference;
}
// Copy the data and reference pointer
// and increment the reference count
pData = sp.pData;
reference = sp.reference;
reference->AddRef();
}
return *this;
}
};
#endif // SMARTPOINTER

我的问题如下
当使用以下中的智能指针类时

SP<MyObject> ptrObject;  //MyObject class is the custom class.
MyObject *ptr = new MyObject;
ptrObject = ptr;  //This invokes the SP(T *) constructor.. why?
//Though operator = ( T*) is not defined.

此时,虽然没有定义operator=(T*)函数,但为什么要调用智能指针的构造函数SP(T*pValue(?我认为构造函数是在创建类对象时调用的
请解释一下,谢谢。

每当在不接受某个类型T1但接受某个其他类型T2的上下文中使用某个类型的表达式时,都会执行隐式转换
特别是:

当调用以T2为参数声明的函数时,表达式用作参数时,
  • 当表达式用作具有期望T2的运算符的操作数时
  • 当初始化类型为T2的新对象时,在返回T2的函数中包括return语句
  • 当在切换语句中使用该表达式时(T2是积分类型(
  • 当表达式用于if语句或循环时(T2为布尔(

这对您有帮助
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.cbclx01/implicit_conversion_sequences.htm