剑指Offer读书笔记[1]

1、在定义一个赋值运算符时,通常需要考虑以下四点:是否将返回值的类型声明为该类型的引用,并在函数结束前返回实例自身的引用(即*this)。只有一个返回引用,才可以允许连续赋值,否则如果函数的返回值是void,应用该赋值运算符将不能做连续赋值。是否将传入的参数类型声明为常量引用。如果传入的参数不是引用而是实例,那么从形参到实参会调用一次复制构造函数,把参数声明为引用可以避免这样的无谓消耗,能提高代码的效率。同时,我们在赋值运算函数内部不会改变传入的实例状态,因此应该在传入的引用参数前加上const关键字。 是否释放实例已有的内存,如果我们忘记在分配新内存之前释放自身已有的空间,恒旭将出现内存泄漏。是否判断传入的参数和当前的实例是否是同一个实例。如果是同一个,则不进行赋值运算,直接返回,如果事先不判断就进行赋值,那么在释放实例自身内存的时候就会导致严重的问题,当*this和传入的参数是同一个实例时,一旦释放了自身的内存,传入的参数的内存将同时被释放,因此将再也找不到需要赋值的内容了。

当我们完整的考虑了上述四个方面以后,我们可以写出如下的代码:

CMyString& CMyString::operator = (const CMyString &str){if(this==&str)return;delete []m_pData;m_pData=NULL;m_pData=new char[strlen(str.m_pData)+1];strcpy(m_pData,str.m_pData);return *this;}2、要想在赋值运算符函数中实现异常安全性,我们有两种方法方法一:先用new分配新内容再用delete释放已有内容。这样只有当分配内容成功后再释放原来的内容,换句话说当分配内存失败时我们可以确定CMyString的实例不会被修改。方法二:先创建一个临时实例,再交换临时实例和原来的实例

下面给出第二种方法的实现代码:

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}3、对于C++和C#中的struct和class的认识C++:在C++中如果没有标明成员函数或者成员变量的访问权限级别,则在struct中默认的是public,在class中的默认的private。C#:在C#中如果没有标明成员函数或者成员变量的访问级别,则struct和class默认都是private,不同的是struct定义的是值类型,其实例在栈上分配内存;class定义的是引用类型,其实例在堆上分配内存。4、在C#中实现单例模式原理:在C#语法中C#是在调用静态函数时初始化静态变量,,.NET运行时可以保证只调用一次静态构造函数,这样我们就可以保证仅初始化一次Instance; 下面给出代码示例:Singleton{private Singleton() { } private static Singleton instance=new Singleton(); public static Singleton Instance {get{ return instance;} }}5、C++数组重要概念6、C#中的String类型7、链表void PrintListReversingly_Iteratively(ListNode* pHead){std::stack<ListNode*> nodes;ListNode* pNode=pHead;while(pNode!=NULL){nodes.push(pNode);pNode=pNode->m_pNext;}while(!nodes.empty()){pNode=nodes.top();printf(“%d\t”,pNode->m_nValue);nodes.pop();}}8、树9、栈和队列栈的特点是后进先出,即最后一个被压入(Push)栈的元素会第一个被弹出(Pop)。队列的特点是先进先出,即第一个进入队列(入队)的元素将会第一个出来(出队)。10、递归与循环递归实现的效率无法和循环相比,因此函数调用会造成时间和空间的损失、会造成重复计算、可能会造成栈溢出。 在经典的斐波那契数列问题中,我们可以采用下面的方法来代替传统的递归方法:int Fiboncci(int n){ int[] result=new int[]{0,1}; if(n<2)return result[n]; int m=1; int n=0; int k=0; for(int i=2;i<=n;i++) {k=m+n;n=m;m=k; } return k;}11、位运算

左移m<

偶尔也要现实和虚伪一点,因为不那样做的话,很难混。

剑指Offer读书笔记[1]

相关文章:

你感兴趣的文章:

标签云: