一. 类和对象
1.对象和对象指针:
Time time, *T;
T = &time;
time.n = 12;
time.show();
T->n = 11; //注意不能使用time->show()的形式,也不能用T.show();
T->show();
还可以通过new实现实例化
Pen *pen = new Pen();
- 对象数组
Time time[10];
time[0].n = 0; //也可以(time+0)->n = 0;
- 类中的内联函数
(1) 隐式内联函数:函数体在类中的函数(不需要inline)
(2) 显示内联函数:在类中声明,在类外定义,但是类中的声明,而且声明时要inline
- 构造函数:可以重载,而且可以有多个;只要声明一个对象就调用一次构造函数;可以传参,注意使用参数初始化表:如Pen(int size):m_size(size){}
- 相同类型的结构体对象可以直接赋值,如Student stu1,stu2;stu1 = stu2
- 析构函数:只能有一个;如果对象是在栈中被创建的,则在对象失去作用域时,系统自动调用析构函数来释放对象占用的内存
8.虚函数:解决基类对象指针无法调用子类函数情况(如果在基类中声明成员函数为虚函数,再将派生类的对象传递给基类指针,通过这个基类指针就可以调用派生类中的的虚函数);
class A
{
public:
void Fun()
{
cout << "It is A" << endl;
}
};
class B:public A
{
public:
void Fun()
{
cout << "This is B" << endl;
}
};
int main()
{
A *a1, a2;
a1 = &a2;
a1->Fun();
B b;
a1 = &b;
a1->Fun();
return 0;
}
上面这个程序就输出两个 It is A
而将A中的Fun()声明为 virtual void Fun(),就可以输出This is B
纯虚函数:含有纯虚拟函数的类称为抽象类,它不能生成对象,格式:virtual void Fun() = 0;(virtual 函数类型 函数名称(参数列表)== 0;)
在一个类中声明纯虚函数,而在派生类中没有重新对该函数进行定义,在纯虚函数在派生类中依然为纯虚函数
- 内联函数:(inline)对于在类中定义的函数比较小的情况下,可以将类中的成员函数定义为内联函数,减少系统的调用时间
- 静态成员:(静态数据和静态函数)属于整个类共有
(1) 静态数据只能在函数外部单独初始化,而且也不能在构造函数中初始化,(但是也可以通过函数和对象改变静态变量的值)如
class A
{
public:
static int a;
A();
};
A::A()
{
//a = 0; //会报错
}
int A::a = 0; //格式为:数据类型 类名::静态数据变量 == 初始值
(2) 静态成员不依赖与对象存在,在程序编译时分配空间,在程序结束时释放空间,故即使不定义对象,也可以为静态成员变量分配空间,进而可以使用该静态成员
class A
{
public:
static int a;
};
int A::a = 0;
int main()
{
cout << A::a << endl;
}
(3) 静态函数与普通函数的区别:普通成员函数在参数传递时编译器会隐藏一个this指针,来确定调用类产生的哪个对象,但是静态成员函数没有this指针,不知道应该访问哪个对象中的数据,所以不可以用静态成员函数来访问普通变量,只能访问静态成员变量
- 友元:可以将一个普通函数或者类申明为一个类的友元,则该函数或者改类中的函数就可以访问该类中的数据了
friend B;//但是必须在前面申明B类哈
friend void Input();
friend void Input(A &aa,int x); //注意要想通过友元函数改变类中数据必须是对对象的引用才行哈
- const:常成员变量,值不可改变,不能再构造函数的定义中为常成员变量赋值,但是可以使用参数初始化表对const成员变量进行初始化
const int a;
A(int x = 1) :a(x)
{
}
10. 常成员函数:只能引用本类中的成员变量而不能修改成员变量
void Output()const //注意不是const void Output()哈,const void Output()并非常成员函数哈,而且const void Output()是乐意修改成员变量的值的,关于二者的区别可见笔记本