剑指offer

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

原文地址:https://www.cnblogs.com/holaworld/p/12374673.html