视频教程:类的成员函数------>包含类文件和主程序分离
class MyClass //自定义类 { //默认私有 public: CString name;//公有属性 int num; public: int Add(int x, int y) { //公有方法 int s; s = x + y; return s; } inline int MAX(int a, int b) { //内联函数.把函数体代码直接插入调用点 int s = a > b ? a : b; return s; } int lifan(int x); //在类内声明类外函数 int cenfa(int a, int b) { //调用私有方法 int s; s = cen(a, b); return s; } private:int cen(int x, int y) { //私有方法,只能被本类调用 int s; s = x * y; return s; } protected:int fanfa() { //受保护方法,只能被本类和子类调用 } }; int MyClass::lifan(int x) { //把类外函数定义为类内函数.注意:在类内必须声明 int y = x * x*x; return y; } void CCMDlg::OnBnClickedButton1() { // 按钮1 MyClass mc; mc.name = _T("张三"); int x=mc.Add(10, 20); int y = mc.cenfa(5, 10); MyClass *p = &mc; //对象指针 p->num = 1000; //通过指针调用属性 x=p->MAX(20, 30); //调用内联函数 y=mc.lifan(10); //SetDlgItemText(label1, ); }
类和主文件分离:
在解决方案资源管理器中右击工程-->添加-->类
点击确定后会自动生成
在头文件的类声明中声明属性和方法
注意:在头文件中声明类时,几乎跟类的定义是一样的,只是把方法体放到了cpp中
在cpp文件中写方法体
在cpp中必须写文件头
cpp中方法属于类外方法,所以必须用::声明属于类方法
在主文件中添加文件头后,就可直接调用属性和方法了:
this指针:
一个类的对象所占用的空间只是属性空间的和,并不包括方法的空间。因为一个类的各个对象是调用同一个方法的,所以方法没必要为各个对象都分配空间
this 是指向这个类创建的对象的指针
构造函数:定义对象时,自动执行的函数
主要用来初始化操作
构造函数名必须与类名相同,没有返回值
构造函数的初始化表:
用name1来初始化name,用num1来初始化num
注意:只有能直接复制的才能用初始化表
不能用this指针
析构函数:对象即将销毁时被调用
类的静态属性:
注意:必须在类外初始化
可以通过对象来访问静态属性:duixian.mm
也可以通过类名访问静态属性:Cmyclass::mm
类的继承:
构造函数和析构函数不能被继承
派生类的定义格式如下:
class <派生类名>:[继承方式]<基类名1>
[,[继承方式]<基类名2>,...,[继承方式]<基类名n>]
{
<派生类新增的数据成员和成员函数定义>
};
3种继承方式下基类成员在派生类中的访问属性
子类的构造函数和析构函数:
构造函数和析构函数不能被继承
规则:
1.如果子类没有构造函数,就调用父类及祖类无参构造函数
2.如果子类有构造函数(不论是无参还是有参),先调用父类及祖类无参构造函数,再调用自己的构造函数
由1、2总结:子类没有显示调用父类及祖类构造函数,默认调用父类及祖类的无参构造函数;如果父类及祖类没有无参构造函数就报错
调用父类及祖类构造函数:
系统会自动调用父类及祖类及对象的析构函数
父对象与子对象相互转换:
子类对象可以给父类对象赋值,俗称大材小用,在赋值时会舍弃子类新增成员
父类对象不能给子类对象赋值,会出现填不满不可预知的错误
一般用指针操作,指针可以互转;指针类型转换后,指针的地址没有变
虚函数:
CmyclassA *p;
p = &mb; //子类对象地址赋值给父类指针;只是赋值属性,不影响一般函数,但影响虚函数
也就是说:这种赋值法,对于一般函数p还是指向父类函数;如果把父类的同名函数设置为虚函数,那么p就指向子类函数了
虚函数的设置:在函数声明时,声明虚函数virtual
天子骄龙:生命诚可贵 时光价更高