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. 接口与抽象类的区别