c++类的创建和继承

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 ;}
};



// 1.类中变量的定义(const量、static量、 static const 量)
//     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;


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值