成员函数
- 当创建类A的实例的时候,以类A为样板建立实例变量,但并不从类A中拷贝所定义的方法
1.一个类的实例的大小只是数据成员的大小,函数并不占用对象的内存空间 - 在类体内定义的函数被默认为内联函数
- 成员函数包含一个默认的参数this
//包含该类的一个指针this,用以指向同一个类的不同对象 void Data::setData(Data *this,int y,int m,int d);
构造函数
- 可采用构造初始化表进行初始化
//其中year,month,day是Data成员变量 Data(int y,int m,int d) : year(y),month(m),day(d){}
- 如果没有定义构造函数,系统将提供一个参数表为空的构造函数(函数体也为空)。成为缺省构造函数,不做任何具体的事情,初始值是随机的
- 如果为类定义了构造函数,则系统不会生成默认的构造函数
-
复制构造函数:
1.特殊构造函数,使用已经存在的对象,初始化一个新的同类对象。
2.每一个类中都必须有一个复制构造函数,如果用户没有声明,系统自动生成一个默认的,其功能把初始值对象的每个数据成员的值都复制到新建立的对象中
3.形参是类的对象,返回值是类的对象,都会调用复制构造函数
//复制构造函数一般形式 类名::类名(const 类名 &引用对象名){ //函数体 }
//默认的复制构造函数 Test a1; Test a2(a1);
4.在C++中,两个同类对象之间可以相互赋值。C++编译程序会为每个类定义一个隐含的赋值运算符(=)重载函数,将一个对象的数据成员值一一赋给另一对象的对应数据成员
5.问题:深复制与浅复制,解决方案:自定义复制构造函数
析构函数
- 每一个类都必有一个析构函数,如果用户没有声明,系统自动生成一个默认析构函数
Test a;Test b;
那么析构的顺序是先b后a,是因为对象的建立是在栈区(我觉的是这样的)?如果类中含有new的东西,要自己析构。
成员对象的构造与析构
- 构造时先成员对象的构造函数,然后自己的构造函数
- 析构相反
- 成员对象的构造顺序与他们的声明顺序一致,而与初始化列表无关(要想到原因)
静态成员
- 静态数据成员:必须进行初始化,初始化只能在类体外进行,不能在构造函数中初始化
- 静态成员函数:在静态成员函数中可以直接引用静态数据成员,不能直接引用非静态数据成员,因为非静态成员函数有一个this指针,而静态成员函数没有,使用时直接使用类名调用静态成员
常对象
类名 const 对象名
或者const 类名 对象名
,它的数据成员值在对象整个生存期间不能改变。
const太乱了,且暂无太大用处,日后再说!!
其他
- 在类体中不允许对数据成员进行初始化
- C++支持两种多态:编译时多态,运行时多态
1.编译时多态:通过函数重载实现的,重载的函数在编译时就可以确定选用那个函数
2.运行时多态:通过虚函数实现,借助抽象类和动态联编