1类的封装性:数据隐藏和提供访问接口;将数据和操作(即函数)封装在类里。
2构造函数:处理数据成员的初始化;名字必须与类名相同。
3析构函数:在对象声明周期结束时自动执行,作用不是删除函数而是在撤销对象占用的内存前完成一些清理工作,不限于释放资源,也可用于执行用户希望在最后一次使用对象之后所执行的任何操作。
static局部对象在函数调用结束时对象不释放,不执行析构函数,只有在main函数结束或调用exit()函数结束程序时,才调用static局部对象的析构函数。
用new建立的对象,用delete释放该对象时会调用该对象析构函数。
4静态数据成员:在类的内部声明,类外定义,被类的所有对象共享,包括该类的派生类对象。
class base{
public:
static int var;
};
int base::var=10;
只声明了类而不定义对象,类的一般数据成员不占内存空间,如果在类中定义了静态数据成员,会为他分配空间。
5静态成员函数:
static int volume();
Box::volume()//类外调用
a.volume();//允许通过对象名调用
作用是为了能处理静态数据成员,静态成员函数没有this指针,因为不属于任何对象,无法对非静态数据成员进行访问。
6对象的存储空间:
C++中每个空类型的实例占1Byte 空间。
成员变量占对象存储空间;静态数据成员,成员函数,构造函数,析构函数不占对象内存空间。
#include <iostream>
using namespace std;
class A{
};
class B{};
class C:public A{
};
class D:public virtual B{
};
class E:public A,public B{
};
int main()
{
A a;
B b;
C c;
D d;
E e;
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
cout<<sizeof(e)<<endl;
return 0;
}
结果是:
1
1
1
8
1
单一继承与多重继承空类空间都是1,虚继承是8,因为涉及虚指针。
9this 指针
指向本类对象的指针,它的值是当前被调用的成员函数所在的对象的起始地址。
只在成员函数中使用,在成员函数开始前构造,结束后清除。
10类模板:
template<class T>
class Operation{
public:
Operation (T a,T b):x(a),y(b){}
T add(){
return x+y;
}
T subtract(){
return x-y;
}
private:
T x,y;
};
T Opeation <T> :: add(){
return x+y;
}//类外定义成员函数
11继承派生略过。
12多态性:具有不同功能的函数可以用同一个函数名。
13虚函数:允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class Box{
public:
Box(int,int,int);
virtual void display();
protected:
int length,height,width;
};
Box::Box(int l,int h,int w){
length=l;
height=h;
width=w;
}
void Box::display(){
cout<<"length:"<<length<<endl;
cout<<"height:"<<height<<endl;
cout<<"width:"<<width<<endl;
}
class FilledBox:public Box{
public:
FilledBox(int,int,int,int,string);
virtual void display();
private:
int weight;
string fruit;
};
void FilledBox::display(){
cout<<"length:"<<length<<endl;
cout<<"height:"<<height<<endl;
cout<<"width:"<<width<<endl;
cout<<"weight:"<<weight<<endl;
cout<<"fruit:"<<fruit<<endl;
}
FilledBox::FilledBox(int l,int h,int w,int we,string f):Box(l,h,w),weight(we),fruit(f){}
int main()
{
Box box(1,2,3);
FilledBox fbox(2,3,4,5,"apple");
Box *pt=&box;
pt->display();
pt=&fbox;
pt->display();
return 0;
}
length:1
height:2
width:3
length:2
height:3
width:4
weight:5
fruit:apple
pt是同一个基类指针,也可以调用同一类族中不同类的虚函数。
如果基类中的display()不是虚函数,无法通过基类指针调用派生类对象中的成员函数的。
C++规定,当一个成员函数被声明为虚函数后,其派生类中的同名函数自动成为虚函数。
非多态行为:在基类中中定义的非虚函数,在派生类中重新定义,如果用基类指针调用该成员函数,则系统调用的是基类成员函数;如果用派生类指针调用该成员函数,则系统会调用派生类对象中的成员函数。
14纯虚函数:在基类中没有定义只作声明的虚函数,要求任何派生类都要定义自己的实现方法。
含有纯虚函数的类被称为抽象类,不能生成对象,但可以声明指针。
构造函数不能声明为虚函数,因为必须明确知道类型才能正确生成对象;析构函数可以声明为虚函数
15单例模式:保证在整个应用程序的生命周期中的任何一个时期,单例类的实例只存在一个。
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
class CSingleton{
private:
CSingleton(){
}
static CSingleton *m_pInstance;
public:
static CSingleton *GetInstance(){
if(m_pInstance == NULL)
m_pInstance = new CSingleton();
return m_pInstance;
}
};
CSingleton * CSingleton::m_pInstance=NULL;
int main()
{
CSingleton *s1=CSingleton::GetInstance();
CSingleton *s2=CSingleton::GetInstance();
if(s1==s2)
cout<<"s1=s2"<<endl;
return 0;
}
s1=s2
单例类CSingleton有以下特征:
(1):有一个指向唯一实例的静态指针m_pInstance,并且是私有的;
(2):有一个公有的函数,可以获取这个唯一的实例,并且在需要的时候创建该实例;
(3):其构造函数是私有的