1.面向对象技术的基本概念
对象,类,继承
2.C++中的空类默认产生哪些成员函数
编译器默认产生默认构造函数,析构函数,拷贝构造函数,赋值函数。
3.构造函数
strct Test{
Test(int) {}
Test() {}
void fun(){}
};
int main(){
Test a(1);
a.fun();
Test b();//这里没有参数传递的构造函数直接用Test b;就可以了
//加了括号反而没有真正实例化类对象
b.fun(); //编译器会在这里检查出错误,b不是类对象
return 0;
}
4.成员变量
- 静态成员变量时在一个类的所有实例间共享数据的,通常在定义时要初始化
- 静态成员变量若为私有,可以通过共有静态成员函数访问
- 初始化列表中的变量初始化顺序是按照成员变量的声明顺序来执行的
- 常量必须在构造函数的初始化列表里初始化,或者将其设置成static
class A
{
const int Size = 0; //不对!
A(){const int Size = 9;//对!
static const int Size =9;//对!
}
5.构造函数和析构函数
- 析构函数virtual原因:当pBase指针撤销时,调用的是CBase的析构函数,而不是CChild的析构函数,这时内存泄露。因为CChild构造时会先调用CBase的构造函数,然后CChild的构造函数,只有基类的析构函数声明为virtual时,析构时才会以同样的顺序依次调用基类的析构函数。
CBase *pBase;
CChild c;
pBase = &c;
- 构造函数不能是虚的
- 虚函数的开销:存在虚函数的对象需要维护一个向量表,如果仅是一个很小的类,且不想派生其他类,那么根本没必要使用虚函数。
- 析构函数的发生:函数返回时
6.String的函数
class String{
public:
String(const char *str = NULL);
String(const String &other);
~String(void);
String & operate = (const String &other);
private:
char *m_data;
}
//构造函数
String::String(const char* str)
{
if( NULL == str)
{
m_data = new char[1];
*m_data = '\0';
}
else
{
int length = strlen(str);
m_data = new char[length+1];
strcpy(m_data,str);
}
}
//析构函数
String::~String(void)
{
delete [] m_data;
}
//拷贝构造函数
String::String(const String &other)
{
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
}
//赋值函数
String& String::operater=(const String &other)
{
if(this = &other)
return *this;
delete [] m_data;
int length = strlen(other.m_data);
m_data = new char[length+1];
strcpy(m_data,other.m_data);
return *this;
}
7.多态的概念
- 一个接口,多种方法。封装和继承是为了代码重用,而多态是为了接口重用。在调用函数时,传递给函数的父对象的值可以是子对象,在运行时根据传递的对象来确定具体的操作。
重载和覆盖的区别:重载是静态的,重载是编译器根据函数不同参数表,对同名函数进行修饰,在编译期间已经绑定了。而覆盖是在子类重新定义了父类的虚函数后,父类根据赋给他的不同子类,动态的调用属于子类的该函数,实现动态绑定。
覆盖需要一致的参数表和返回值,而重载参数表可以不同。
网友评论