class CExample
{
private:
int a;
public:
//构造函数
CExample(int b)
{
a = b;
cout<<"creat: "<<a<<endl;
}
//拷贝构造
CExample(const CExample& C)
{
a = C.a;
cout<<"copy"<<endl;
}
void Show ()
{
cout<<a<<endl;
}
};
如果是传值引用,即
CExample( CExample C)
{
a = C.a;
cout<<”copy”<<endl;
}
若在main中声明
CExample a = 10;
CExample b = a;
则由于传值引用要拷贝参数的副本,因此在构造函数中,要再次调用构造函数CExample(a),造成递归,因此编译器不会通过的。
2、赋值运算符函数的编写
CMyString的定义如下
class CMyString
{
public:
CMyString(char* pdata = null);
CMyString(const CMyString & str);
private:
char* m_pdata;
}
编写赋值运算符函数。
CMyString& CMyString::operator = (const CMyString &str)
{
if(&str == this)
return *this;
delete []m_pdata;
m_pdata = null;
m_pdata = new char[strlen(str.m_pdata)+1];
strcpy(m_pdata, str.m_pdata);
return *this;
}
注意点:
(1)返回自身类型引用
(2)参数为常量引用
(4)复制前首先释放原实例内存。释放内存前,先判断传入参数与自身是不是同一实例,如果是同一实例且没判断,则在释放自身内存时,传入参数的内存也一起释放掉了。
考虑异常安全性,有更好的代码:
CMyString& CMyString::operator = (const CMyString &str)
{
if (this != &str)
{
CMyString strTemp(str);
char *pTemp = strTemp.m_pdata;
strTemp.m_pdata = m_pdata;
m_pdata = pTemp;
}
return *this;
}
测试用例:
(1)将一个实例赋值给另一个实例
(2)连续赋值
(3)将一个实例赋值给自己
3、c++中struct 和 class区别
默认访问权限不同。struct默认为public, class默认为private,其他一样。