剑指offer PART 2

剑指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;
};

关注点:

  1. 是否把返回值得类型声明为该类型的引用,并在函数结束前返回实例自身的引用(*this),因为只有返回引用才可以允许连续赋值。若返回void,则无法进行连续复制
  2. 是否把传入的参数的类型声明为常量引用。若参数的非引用,而为实例,则形参到实参会调用一次复制构造函数。
  3. 是否释放实例自身的内存。若在分配新内存之前未释放自身已有的空间则会导致内存泄露
  4. 判断传入的参数和当前的实例(*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模式

题目: 设计一个类,只能生成该类的一个实例

https://blog.csdn.net/Rick1860/article/details/82984183

原文地址:https://www.cnblogs.com/yulongzhou/p/10777516.html