剑指Offer学习笔记

面试题1:赋值运算符函数

如下为CMyString的声明,请为该类添加赋值运算符函数。

class CMyString{

public:

    CMyString(char* pData = NULL);

    CMyString(const CMyString& str);

    ~CMyString(void);

private:

    char *m_pData;

};

注意点:

1.函数应返回自身的引用,这样才可以进行连续赋值。str1=str2=str3;

2.应该将传入的参数值声明为常量引用,减少复制消耗,并且保证不修改传入的实例。

3.释放自身的内存。

4.判断传入的实例是否就是自身,如果就是自身,那么释放内存时就会将传入的实例释放,导致无法复制。

参考代码:

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;

}


面试题2:实现singleton模式

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

注意点:

1.线程安全,考虑到多线程环境,两个线程可能同时创建一个实例。

2.效率高。

3.代码简洁。

单例的两种模式

        懒汉模式:在第一次使用的时候才实例化对象

        饿汉模式:在单例类定义时就实例化对象

代码实现:

懒汉实现:

class LazySingleton{

protected:

    LazySingleton(){

        pthread_mutex_init(&mutex, NULL);

    }

public:

    static pthread_mutex_t mutex;

    static LazySingleton* instance();

    int a;

};

pthread_mutex_t LazySingleton::mutex;

LazySingleton* LazySingleton::instance(){

    pthread_mutex_lock(&mutex);

    static LazySingleton obj;

    pthread_mutex_unlock(&mutex);

    return &obj;

}

饿汉实现:

class HungrySingleton{

protected:

    HungrySingleton(){


    }

private:

    static HungrySingleton* p;

public:

    static HungrySingleton* instance();

};

HungrySingleton* HungrySingleton::p = new HungrySingleton();

HungrySingleton* HungrySingleton::instance(){

    return p;

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容