类成员初始化总结:
(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,属于面向接口编程,符合开-闭原则。