1.类的定义格式:
#ifndef _AAAAAA_
#define _AAAAAA_
//引入类中需要用到的头文件,定义宏等
class A{
private:
public:
protected:
friend void f();
};
void f();//这个是类的非成员函数,但是由于此函数又要操作到类的成员变量,为了访问方便,所以就在类中声明此函数是类的友员函数。(友员函数或类是可以直接访问类的成员变量的)
#endif
2类的构造函数的申明/定义的方法
1. public:下
A(int aa,int bb):a(aa):b(bb)
{
}
2 public:下
A(int aa,int bb);这种类似于普通函数的申明,然后再.CPP文件中实现
3.在类定义时,类的成员函数可以直接使用此类中的私有属性。
同时,类的成员函数中存在此类的对象时,此对象也可以使用.操作符直接访问其私有属性,而不用通过public函数。为什么这么定义呢?原因很简单,私有是为了实现“对外”的数据隐藏,而在设计类时,没有必要禁止对私有变量的直接访问。这样才能高效的创建类。类创建完成后,其内容根本就不和会变了。这种访问私有成员的方式也不会产生安全性问题。
4.子类与父类的访问规则(分为子类到父类的访问规则,对象到父类的访问规则)
class a{codeA};
class b : (private/public/protected) a{codeB};
b b1;
1.前两行中,b是a的子类,b类的实现代码codeB对a类的实现代码codeA的元素的访问由a中定义的访问属性决定,有public/protected修饰的方法或属性在codeB中可以直接引用。
2.第三行中,b1是b类的实例,其对继承自a类中的元素的访问由codeA的元素的访问属性以及b继承a的属性(代码中的括号中)共同决定。class b :(private) a{},当b类是这样定义的,则b1是无法访问a中任何元素的。通常我们定义b是这样的class b: public a,这样,b1可以调用a类以及b类中的public属性或方法。总结:实例只可以访问public元素,访问规则:
- 继承性,f在a类和b类中都定义为public时,b1.f先访问b类中的f,b类中没有定义f,则访问a类中的f。(若a有实例a1,则a1.f自然是访问a类中的f)
- 多态性,f在a类和b类中都定义为virtual时,同时有public F(){ f; },当a* p=new b时,调用p.F时,F中f是a类中的还是b类中的f是根据调用此f的实例对应的类决定的。类中有个虚函数表,保存的是f的调用顺序,从本类到父类的顺序。
- 例子如下:
class a { protected: virtual void ff(){cout<<"af"<<endl;} public: void d(){cout<<"ad"<<endl; ff();} }; class b: public a { protected: virtual void ff(){cout<<"bf"<<endl;} public: void d(){cout<<"bd"<<endl; ff();} }; int main() { a* p=new b; p->d(); }
- 输出是ad和bf,因为d不是虚函数,根据p类型确定调用a类中d函数。d中的ff是虚函数,根据p对应的实例为b类的实例。所以从b类中的虚函数表查找ff,而b类中定义了ff,所以其是第一个被调用的。
1类中的const量,引用量,成员对象,的初始化要在构造函数的初始化列表中实现。static量要在类外部初始化。
2创建类的一个对象时,先调用此构造函数的初始化列表(1.按照成员对象申明顺序,调用成员对象的构造函数(没有显示指定就调用默认的构造函数),2.调用其基类的构造函数(没指明就调用默认的)),然后再调用此构造函数。
例如
class C : B{
D d;
public:
C(){...}
}
C c //则默认调用C():d(),B(){.....}:先成员对象,在基类,在自己
class A{
int a;
public:
A(int c):a(c){}
A& combine(A aa){a += aa.a;return *this;}//这里的a+=aa.a;语句是可以的,在类的定义中,可以直接使用类对象.成员变量来访问成员变量
int sa()const {return a ;}
};
// const:类的构造函数初始化列表中定义
// static:类的外部定义(不需要加static修饰)
// const static: int型可以在申明时直接定义。其他都在外部定义(要加const修饰)
class A{
static const int a;//只有静态常量整形数据可以在类中初始化,其他静态变量,非静态常量都不可用在类中定义!类中定义了const的量应该具有static属性的,const量是不可变的,所以每个对象使用的都是相同的const量,完全可以放在static中保存
const int b;
static int c;
public:
A():b(45){
}
};
//int A::b=12;//错误的,非静态成员数据不能在类的外部定义
int A::c=23;
const int A::a=23;