剑指Offer学习笔记

2018-04-01  本文已影响0人  caoxian

面试题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;

}

上一篇 下一篇

猜你喜欢

热点阅读