剑指offer PART 2
书点击自取 提取码: njku
标签(空格分隔): 笔记
C++知识点:
1、面向对象的特性 2、构造函数 3、析构函数 4、动态绑定 5、常用的设计模式 6、UML图 7、算法(空间、时间 复杂度)
Content of Q
序号 | 题目 | 页数 |
---|---|---|
1 | 赋值运算符函数 | 25 |
Q:下列程序为何会编译错误
class A
{
private:
int value;
public:
A(int n) { value = n; }
A(A other) { value = other.value; }
void Print() { std::cout << value << std::endl; }
}
int _tmain(int argc, _TCHAR* argv[])
{
A a = 10;
A b = a;
b.Print();
return 0;
}
A:
在 A b = a 时调用拷贝构造函数,而拷贝构造函数 A(A other)中参数为实例,而此时实例 other 也没有创建,故需要先 A other = a;而此时会再一次调用拷贝构造函数,则会再一次调用 A other = a,依次循环...,所以此语句会陷入无限循环,故会编译错误。
正确写法的拷贝构造函数的参数应为常量实例引用
A( const A &other);
Q1:赋值运算符函数
题目:如下为类型的CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
pravite:
char* m_pData;
};
关注点:
- 是否把返回值得类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this),因为只有返回引用才可以允许连续赋值。若返回void,则无法进行连续复制
- 是否把传入的参数的类型声明为常量引用。若参数的非引用,而为实例,则形参到实参会调用一次复制构造函数。
- 是否释放实例自身的内存。若在分配新内存之前未释放自身已有的空间则会导致内存泄露
- 判断传入的参数和当前的实例(*this)是否为同一个实例,若为同一个则不进行复制操作,直接返回。
初级程序的经典解法
CMyString& CMyString::operator = (const CMyString &str)
{
if(this == &str)
return *this;
delet []m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}
Q1.1: C++中可以用struct和 class来定义类型。这两种类型的区别是什么?
如果没有标注成员函数或者成员变量的访问权限级别,那么在struct中默认为public,而在class中默认的private。
Q2:实现Singleton模式
题目: 设计一个类,只能生成该类的一个实例