1.拷贝构造函数
Line( const Line &obj); √ //常量引用
Line( Line obj); ×
形参复制到实参会调用拷贝构造函数,所以会形成无休止的递归调用从而导致栈溢出。
2.运算符重载
传参类型声明为常量引用。
引用:从形参到实参就不会调用拷贝构造函数,比面无谓消耗,提高代码效率。
常量:不会改变传入的实例的状态
CMyString& CMyString::operator =(const CMyString &str) //传入的参数为常量引用 { if(this == &str) //同一个实例,直接返回 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; //返回引用,以允许连续赋值 }
CMyString& CMyString::operator =(const CMyString &str) { if(this != &str) { CMyString strTemp(str); //在构造函数里用new分配内存,保证了异常安全性 char* pTemp=strTemp.m_pData; strTemp.mpData=m_pData; m_pData=pTemp; } //超出变量作用域,自动调用strTemp的析构函数, //把strTemp.m_pData所指向的内存(即原m_pData内存)释放掉 return *this; }
3.singleton
4.sizeof
sizeof(数组名) = n个元素*单个元素的大小
sizeof(指针) = 4