通过一个例子学习C++的类
#include<iostream> //头文件
#include<string> //因为使用了string字符,所以添加string的头文件
using namespace std;
class Building //建立一个名为Building的类
{
protected: //一般这里都是private成员,也就是我们所说的私有成员,但这里使用了保护成员,下面会介绍三种成员的用法
string name;
float height;
float area;
public:
Building(string n,float h,float a):name(n),height(h),area(a){}; //构造函数
Building(const Building&bd1) //函数的重载,名称一样,赋值参数不同,调用时,通过赋值的参数不同,决定调用不同的构造函数
{
name=bd1.name;
height=bd1.height;
area=bd1.area;
}
string Getname(){
return name;
}
float Getheight(){
return height;
}
float Getarea(){
return area;
}
//虚函数,使得子类中有一个名称一样的函数时,这里使用虚函数,那么即使调用的是父类的这个函数,也会执行子类的相同名称的函数
virtual float FoundationDepth(){
return height/15;
}
float HeightDifference(Building&bd){
return height-bd.height;
}
float HeightDifference(float h){
return height-h;
}
//朋友函数,在外界定义了一个函数,但是要调用类里的变量,声明朋友函数,并且在这里声明,且注意其参数,只写前缀
friend bool Correction(Building&,float,int);
//+号的重载
Building operator+(float difference)
{
Building bd(*this);
bd.height+=difference;
return bd;
}
//>号的重载
bool operator>(Building&a)
{
/*if(this->area>a.area)
{
return true;
}
else
{
return false;
}*/
return this->area>a.area;
}
} ;
//子类,通过public的方式继承父类
class Mansion:public Building
{
private:
unsigned short stories;
public:
Mansion(string n,float h,float a,unsigned short s):Building(n,h,a),stories(s){};
void SetStories(unsigned short s)
{
stories=s;
}
unsigned short GetStories()
{
return stories;
}
float FoundationDepth()
{
return height/14;
}
};
float operator+(Building&a,Building&b){
return a.Getarea()+b.Getarea();//这里因为是在类外,所以只能调用共有成员,无法使用.area
}
bool Correction(Building&building,float difference,int type)
{
switch(type)
{
case 1:building.height+=difference;return true;
case 2:building.area+=difference;return true;
default:return false;
}
}
int main()
{
Building bd("水塔",20,8);
/*cout<<bd.Getname()<<"的高度是:"<<bd.Getheight()<<"米,占地面积是"<<bd.Getarea()<<"平方米。\n";
Correction(bd,-1,2);
cout<<bd.Getname()<<"的高度是:"<<bd.Getheight()<<"米,占地面积是"<<bd.Getarea()<<"平方米。\n";
*/
Building bd2(bd);
/*cout<<bd2.Getname()<<"的高度是:"<<bd2.Getheight()<<"米,占地面积是"<<bd2.Getarea()<<"平方米。\n";
cout<<"bd2地基深度:"<<bd2.FoundationDepth()<<"米\n";
Correction(bd,3,1);
cout<<"bd与bd2高度之差为"<<bd.HeightDifference(bd2)<<endl;
cout<<"bd2与bd高度之差为"<<bd2.HeightDifference(bd.Getheight())<<endl;*/
bd=bd+7;
cout<<bd.Getname()<<"的高度是:"<<bd.Getheight()<<"米,占地面积是"<<bd.Getarea()<<"平方米。\n";
cout<<"两个的面积之和是"<<bd+bd2<<endl;
Building bd3("洋房",5,100);
if(bd>bd3)
{
cout<<"水塔占地面积大于洋房\n";
}
else
{
cout<<"水塔占地面积不大于洋房\n";
}
Mansion mansion1("公寓",15,100,5);
cout<<"mansion1的占地面积:"<<mansion1.Getarea()<<endl;;
cout<<"公寓的地基"<<mansion1.FoundationDepth()<<endl;
Building*mansion2=new Mansion("洋房",15,300,4);
cout<<"洋房的地基"<<mansion2->FoundationDepth();
return 0;
}
知识点
1.三种成员
private成员:私有成员,避免外界通过.XX调用修改
public成员:公有成员,类外界可以调用
protected成员:保护类成员,这里需提出一个父类,子类的概念,保护类成员的使用,使得父类的保护类成员可以被子类调用,但是同样不能被外界调用,但是私有成员即使子类也不可以调用,。
2.类的继承
上述代码中定义了一个父类Building,还定义了一个父类的子类Mansion,这里Mansion类通过public继承了父类的定义,子类继承了父类的所有东西,并且可以定义属于自己的新的东西,也就是对父类做了扩展。