程序=数据结构+算法

一般来讲,把要解决的实际问题中的对象的共同特性->数据结构,把行为->函数(算法)这一过程叫做抽象

把类的定义,包含数据结构和算法紧密联系起来这一过程叫做封装

对象/实例 是 类的变量名,生成一个实例的过程称之为实例化

对象的大小相当于sizeof(对象中所有变量的和),每个对象有各自的存储空间

code如下:

class CRectangle
{
    public:
        int w,h;
        int Area();
        void Init(int _w,int _h);
};
int CRectangle::Area() //具体定义写在class内部的话,就不用有CRectangle::
{
    return w*h;
}
void CRectangle::Init(int _w,int _h) //具体定义写在class内部的话,就不用有CRectangle::
{
    w=_w;h=_h;
}


//访问方法
1.对象名.成员名
CRectangle r;
r.w=5;
2.指针
CRectangle r;
CRectangle* p=&r;
p->w=5;
3.引用名.成员名
CRectangle r;
CRectangle & ref_r=&r;
ref_r.w=5;

注意,对象名作为实参传递时,会拷贝一份(复制构造函数)。所以一般传递的是引用或者指针。

访问权限

通过public,private和protected关键字实现。注意:默认是private的。

protected除了自己,子类的指针或引用也可以访问。

可以通过friend关键字在类内声明友元函数,达到private的部分权限释放功能。友元函数,友元类。

B是A的友元类说明B的成员函数可以访问A的私有变量,友元的关系不能传递或者继承。

class A
{
    friend class B;    //B是A的友元类
    friend void B::func();//classB的func可以访问A的私有变量
    friend func_pub();
}

内联函数

整个函数出现在类定义内部,默认是内联函数。

重载

函数名相同,参数不同,可以重载。注意,有缺省值的函数容易出错使得重载有二义性。

封闭类

类成员变量中有其他类的对象的时候,该类称之为封闭类。封闭类一般都需要自己写初始化,因为封闭类中的成员对象的初始化一般无法由系统自动完成。

封闭类的构造函数的执行顺序是,先执行成员对象的构造函数,然后执行封闭类的构造函数。

析构函数的顺序是,先执行封闭类的析构函数再执行成员对象的析构函数。

封闭类的构造函数一般使用初始化列表构造,这是因为,初始化列表相比赋值,如果有形参是对象,直接调用复制构造函数。如果不使用,会先调用默认构造函数再进行操作符重载的赋值操作。所以在初始化列表有自定义类的时候,理论上速度上会快一些。

code:

INIT(string s, int i):name(s), id(i){};

初始化

class CTypeInit{  
public:  
    CTypeInit( int c):m_c(c),m_ra(c){  
    }  
private:  

    int m_a;                //通过初始化列表初始化,  
                            //或者构造函数初始化  
    /*引用*/  
    int &m_ra;              //只能通过初始化列表初始化  

    /*静态变量*/  
    static int m_b;         //不能通过初始化列表初始化,  
                            //不能在类内进行初始化,  
                            //不能在构造函数中初始化,  
                            //只能在类外初始化  

    /*常量*/  
    const  int m_c;         //只能通过初始化列表初始化,  
                            //不能在类内进行初始化,  
                            //不能在构造函数中初始化,  
                            //不能在类外初始化  

    /*静态整型常量*/  
    static const int m_d;   //(整型)能否在类中初始化,取决于编译器  
                            // 能在在类外初始化,不能带static  

    /*静态非整型常量*/  
    static const double m_e;//(double型)能否在类中初始化,取决于编译器  
                            // 能在在类外初始化,不能带static  
};  

//静态成员变量,必须在类外初始化,且要去掉static关键字  
int CTypeInit::m_b = 6;  
const int CTypeInit::m_d = 6;  
const double CTypeInit::m_e = 3.1415926;  

int main()  
{  
    CTypeInit obT(2);  
    return 0;  
}

results matching ""

    No results matching ""