C++类成员初始化总结以及面向对象编程原则

类成员初始化总结:
(1)只有静态常量整形可以在类内初始化。如:static const int val1 = 1;
(2)const成员(非static)和引用型成员只能且必须在构造函数初始化列表里初始化,非const非static可以在构造函数内部或者在其初始化列表初始化。
(3)非const的static或者 非整形static const 都必须在类外部初始化。

class Test
{ 
private:
const int var2;
int var3;
static int var4;
static const double var5;
static const int var6 = 6;//静态常量整形变量,可以在类内初始化 

public:
Test();//构造函数
 };

Test::Test(void):var2(2)//初始化列表初始化
{var3 = 3;}//可以在函数内初始化,也可以像var2一样在类的初始化列表初始化 

int Test::var4 = 4; //非const的static ,只能在类外初始化
double Test::var5 = 5.0; //同非const的static,必须在类外初始化 

 
 

//节选自《新概念C++程序设计》

面向对象程序设计的基本原则(部分):

(1)合成/聚合优先原则。

简述为:尽量使用合成/聚合而尽量不使用继承(继承破坏封装性)。

(2)开-闭原则。

简述为:模块应该尽量在不修改原来代码的前提下扩展。

(3)面向抽象原则(又名依赖倒转原则)。

简述为:抽象不应该一来细节,细节应该依赖抽象。“面向接口编程。”

(4)单一职责原则。

通过分割职责来封装变化。

(5)接口分离原则。

使用多个专门的接口而非单一的总接口。

示例:

 
 
//计算圆面积
class Circle
{
private:
     static double P;    
    double radius;
 
public:
    Circle(){radius = 0;}
    Circle(double r) {radius = r;}
    double getArea() {return (P*radius*radius);}
};
 
double Circle::P = 3.1415926;
 
//继承方式,计算圆柱体体积
class Pillar:public Circle
{
private:
    double height;
public:
    Pillar(Circle r, double h):height(h),Circle(r){}
    double getVolum() {return getArea()*height;}
};

//合成/聚合方式,计算圆柱体体积
class Pillar1
{
private:
    Circle bottom;
    double heigt;
public:
    Pillar1(Circle b,double h):bottom(b),heigt(h){}
    double getVolum(){return bottom.getArea()*heigt;}
}; 

int main( )
{
    double r,h;
    cout<<"Input the radius:"<<endl;
    cin>>r;

    Circle cir(r);
    cout<<"The squre is: "<<cir.getArea()<<endl;

    cout<<"Input the height:"<<endl;
    cin>>h;
    cout<<"The Volume is:"<<endl;

    Pillar1 Vol(r,h);

    cout<<Vol.getVolum()<<endl;

    return 0;
}


//根据以上基本规则修改上述代码:
#include <iostream>
using namespace std;

class shape//获得面积接口类
{
public:
    virtual double getArea() = 0;
};

class drawphoto//画图接口类,与面积接口分离,单一职责原则
{
public:
    virtual void draw() = 0;
};

class circle:public shape,public drawphoto
{
private:
    static double Pi;
    double radius;

public:
    circle(double r):radius(r){}
    double getArea(){return Pi*radius*radius;}
    void draw(){cout<<"draw a circle."<<endl;}
};
double circle::Pi = 3.1415;

class pillar
{
private:
    shape &sh;//合成/聚合优先
    double height;

public:
    pillar(shape &s, double h):sh(s),height(h){}
    double getVolum(){ return sh.getArea()*height;}
    void draw(){cout<<"draw a pillar.\n";}
};
int main( )
{
    double r,h;
    cout<<"Input the radius of the circle:"<<endl;
    cin>>r;
    circle cir(r);
    cout<<"the squre of the circle is :"<<cir.getArea()<<endl;
    cir.draw();

    cout<<"Input the height of the pillar:"<<endl;
    cin>>h;
    shape &s = cir;//用实力类对象初始化接口引用
    pillar pil(s,h);
    cout<<"The volum of the pillar is :"<<pil.getVolum()<<endl;
    pil.draw();

    return 0;
}
上述代码中,如果添加求正方形面积,只需添加正方形类并继承shape和drawphoto,求体积的时候不需要修改pillar,属于面向接口编程,符合开-闭原则。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值