类(Class)
定义:类是对象的抽象。相同特征的一组对象进行抽象形成了类。
比如,可以对不同的学生个体进行抽象,形成学生类。
本质上讲,类也是一种数据类型,是由程序员根据处理问题的需要自己创建的一种数据类型,即用户自定义的数据类型,而一个具体的对象可以视为属于这一数据类型的一个变量。
任何一个对象都是通过类的实例化之后得到的。
类型(type) 是一个概念的具体表示。如果不能用内置类型表达一个概念,则我们设计一个新类型去表达一个概念。
任何一个数据类型都封装两方面的信息:数据和操作。
|
类 是由数据成员和成员函数组成,
数据成员:定义了该类对象所共有的属性(类似于结构体成员);
成员函数:定义了该类对象所共有的操作(类似于结构体中的函数)。
|
简单的类的举例:
一个student 的类;
该类对象所共有的属性:姓名,学号,专业,年级,数学成绩,英语成绩…
该类对象的操作
输出每个对象的信息
修改每个对象的信息,等等
利用学生类可以构造一个学生对象。
类是一种用户自定义类型,声明形式:
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
}; //此处必须要以分号结尾
类的任何成员都必须指定访问属性。
一般将数据成员定义为私有成员或保护成员,将成员函数定义为公有成员。
private:
只能由1.该类中的函数、2.其友元函数访问。
不能被任何其他访问,该类的对象也不能访问。
public:可以被
1.该类中的函数、2.派生类的函数、
3.其友元函数访问,也可以由
4.该类的对象访问。
钟表类
class Clock
{
public:
void SetTime(int NewH, int NewM, int NewS);
void ShowTime(); //成员函数
private:
int Hour, Minute, Second; //成员数据
};
|
圆类
const float pi=3.14;
class Circle
{
public:
void SetRadius (float r1){r=r1;}
float GetPerimeter(){ return 2*pi*r;}
float GetArea(){ return pi*r*r; //成员函数
}
private:
float r; //成员数据
};
成员数据:与一般的变量声明相同,但需要将它放在类的声明体中。
|
|
类定义和使用时应注意:
-
在类的声明中不能对数据成员进行初始化。
-
. 类的任何成员都必须指定访问属性,一般将数据成员定义为私有成员或保护成员, 成员函数定义为公有成员。
-
类中的数据成员可以是C++语法规定的任意数据类型,但不能用存储类型auto、register或extern进行修饰。
-
类的成员可以是其他类的对象,但不能以类自身的对象作为本类的成员。
-
类定义必须以分号“;”结束
-
class与struct的不同:
①class中,成员缺省情况是private。 ②struct中,成员缺省情况是public。
成员函数
可以在类中说明原型,在类外给出函数体实现,并在函数名前使用类名加以限定。
将成员函数在类外定义的一般形式是:
返回类型 类名∷成员函数名(参数表)
{
// 函数体
}
也可以直接在类内给出函数体,形成内联成员函数。
允许声明重载函数和带默认形参值的函数
钟表类例子
class Clock
{
public:
void SetTime(int NewH, int NewM, int NewS);
void ShowTime();
private:
int Hour, Minute, Second;
};
void Clock::SetTime(int NewH, int NewM,int NewS)
{
Hour=NewH;
Minute=NewM;
Second=NewS;
}
void Clock::ShowTime()
{
cout<<Hour<<":"<<Minute<<":"<<Second;
}
类中成员的访问方式:
类中成员互访:直接使用成员名
类外访问:使用“对象名.成员名”方式访问 public 属性的成员。
对象成员的引用:一般形式: 对象名.成员名
在类外只能访问public成员,不能访问private成员。
通过指向对象的指针访问对象中成员
一般形式:指针名->成员名
|
例:
一圆形游泳池如图所示,现在需在其周围建一圆
形过道,并在其四周围上栅栏。栅栏价格为35元 /米,过道造价为20元/平方米。过道宽度为3米,
游泳池半径由键盘输入。要求编程计算并输出过
道和栅栏的造价。
#include <iostream>
using namespace std;
const float PI = 3.14159;
const float FencePrice = 35;
const float ConcretePrice = 20;
//声明类Circle 及其数据和方法
class Circle
{
private:
float radius;
public:
setRadius(float r);
float Circumference(); //圆周长
float Area(); }; //圆面积
// 类的实现
// 初始化数据成员radius
Circle::setRadius(float r)
{radius=r;}
// 计算圆的周长
float Circle::Circumference()
{
return 2 * PI * radius;
}
// 计算圆的面积
float Circle::Area()
{
return PI * radius * radius;
}
void main ()
{
float radius;
float FenceCost, ConcreteCost;
// 提示用户输入半径
cout<<"Enter the radius of the pool: ";
cin>>radius;
// 声明 Circle 对象
//Circle Pool(radius);
//Circle PoolRim(radius + 3);
Circle Pool;
Circle PoolRim;
Pool.setRadius(radius);
PoolRim.setRadius(radius+3);
//计算栅栏造价并输出
FenceCost=PoolRim.Circumference()*FencePrice;
cout<<"Fencing Cost is ¥"<<FenceCost<<endl;
//计算过道造价并输出
ConcreteCost=(PoolRim.Area()-Pool.Area())*ConcretePrice;
cout<<"Concrete Cost is ¥"<<ConcreteCost<<endl;
}