标签:
l 基础知识:c++的基础知识:面向对象的特性、构造函数、析构函数、动态绑定等,还有常见的设计模式、UML图
l C++知识点:sizeof
l C++知识点:复制构造函数,
l C++推荐书目
Effective c++ 适合在面试之前突击c++,该书提到的问题也是面试官喜欢问的问题。
C++ primer 全面了解c++
Inside c++ Object model 没入了解c++对象的内部。可以解决c++的很多难题。
The C++ Programming Language 全面深入掌握c++。
l C++赋值运算符函数
关注点:
1) 返回值类型为该类型的引用,这样才可以连续赋值
2) 传入的参数的类型声明为常量引用,若不是引用则会从形参到实参调用一次复制构造函数。
3) 如果实例自身有堆区的内存,不要忘记释放原有的内存,并且在c++中我们习惯的做法是:同类型每个实例内部的堆区内存相互独立,即地址不相同,所以不要忘记在分配新内存之前释放自身的空间
4) 要记得判断传入的参数和当前的实例(*this)是不是同一个实例即地址是否相同,如果相同则什么样不做,不同则继续进行复制,这个判断在实例自身有堆区的内存时是必不可少的,因为如果当前实例和传入的实例是同一个实例,同时该实例又有堆区的内存,如果不加判断就释放堆区内存,那么删除之后传入的那个实例的堆区内存也删除了,就没有办法赋值了。
#include <iostream> #include <string.h> //#include <bad_alloc.h> class CMyString{ public: CMyString(char * pData = NULL); CMyString(const CMyString & ); CMyString & operator=(const CMyString & ); ~CMyString(); private: char * m_pData; }; CMyString::CMyString(char * pData) { m_pData = NULL; m_pData = new char[strlen(pData) + 1]; //if(!m_pData)throw bad_alloc;//这里还不知道如何使用 strcpy(m_pData,pData); } CMyString::CMyString(const CMyString & str) { CMyString(str.m_pData);//不知道怎么样; /* m_pData = NULL; m_pData = new char[strlen(str.m_pData) + 1]; //if(!m_pData)throw bad_alloc;//这里还不知道如何使用 strcpy(m_pData,pData); */ } /*版本一*/ //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) return * this; CMyString strTmp(str);//调用复制构造函数;这里面实现的其实是new的功能 ,同时也处理异常情况; char * chTmp = strTmp.m_pData; strTmp.m_pData = m_pData;//这样可以利用局部对象strTmp的析构函数来删除本对象的原来的栈区; m_pData = chTmp; return * this; } CMyString::~CMyString() { } int main() { return 0; }
标签:
原文地址:http://www.cnblogs.com/dragonfive/p/4334113.html