C++面试整理之二

1. 五大设计原则

    1)单一职责原则:一个类只负责一项职责。

    2)接口隔离原则:一个类对另一个类的依赖应该建立在最小的接口上,不应该依赖它不需要的接口。

    3)里氏替换原则:使用基类的地方可以透明地使用其子类的对象。

    4)依赖倒置原则:高层模块不应该直接依赖低层模块,而应该依赖其抽象。

    5)开闭原则:对扩展开放,对修改关闭。

2. 重载、重写与隐藏的区别

   重载:在一个域中,函数名称相同,但是参数不同。

    重写:子类覆盖基类中函数名称相同,参数相同,返回值相同(或返回值是基类函数返回值的子类)的虚函数。

    隐藏:子类和基类函数名相同,但是参数不同。子类和基类函数名相同,参数相同,但是基类函数没有virtual修饰。

3. 深拷贝与浅拷贝

   如果一个类拥有资源,且在类对象拷贝的过程中,资源重新分配,这个过程就是深拷贝。反之,如果没有资源重新分配,就是浅拷贝。

4. 智能指针

    智能指针是一个类,存储了一个指向动态分配对象的指针。智能指针对象被销毁的时候,可以确保该动态分配对象被释放。

5. 编写C++中的两个类,一个只能在栈中分配空间, 一个只能在堆中分配

class StackOnly {
public:
    StackOnly() {}
    ~StackOnly() {}

private:
    void* operator new(size_t size) {}
    void operator delete(void* ptr) {}
};

class HeapOnly {
public:
    static HeapOnly* create() {
        return new HeapOnly();   
    }
    void destroy() {
        delete this;
    }

protected:
    HeapOnly() {}
    ~HeapOnly() {}
};

6. string类的构造、析构、拷贝构造函数和赋值函数

String::String(const char* pstr) {
    if(pstr == NULL) {
        m_str = new char[1];
        m_str[0] = '\0';
    } else {
        m_str = new char[strlen(pstr) + 1];
        strcpy(m_str, pstr);
    }
}
String::~String(void) {
    if(m_str) {
        delete[] m_str;
        m_str = NULL;
    }
}
String::String(const String& other) 
    : m_str(NULL)
{
    String temp(other.m_str);
    swap(m_str, temp.m_str);
}
String& operator=(const String& other) {
    if(this != &other) {
        String temp(other.m_str);
        swap(m_str, temp.m_str);
    }

    return *this;
}

7. 继承与组合的区别

    继承是is-a的关系,组合是has-a的关系。

8. 接口与抽象类的区别



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值