类和对象的定义与访问:
类的定义:
类型(type)是一个概念的具体表示。依照OO的理念:如果不
能用内置类型表达一个概念,则我们设计一个新类型去表达
一个概念。
任何一个数据类型都封装两方面的信息:
数据
操作
类的组成
一组数据成员(data member)
定义了该类对象所共有的属性
(类似于结构体成员)
一组成员函数(member function)
定义了该类对象所共有的操作
(类似于结构体中的函数)
一个简单的类
Student 类
该类对象所共有的属性
姓名,学号,专业,年级,数学成绩,英语成绩…
该类对象的操作
转专业
跳级/留级
输出每个对象的信息
修改每个对象的信息
等等
利用学生类可以构造一个学生对象。
C++类的声明形式
类是一种用户自定义类型,声明形式:
class 类名称
{
public:
公有成员(外部接口)
private:
私有成员
protected:
保护型成员
} ;
类定义必须以分号“;”结束。
类的任何成员都必须指定访问属性。一般将数据成员定义为私有成员或保护成员,将成员函数定义为公有成员。
c++ 中为什么要定义public, protect, private 三种访问权限?
对于类的成员来说,有些需要给外面看的,也就是对外接口,那么就是public,如果没有,那么我们做的工作将是毫无意义的,(别人没法用)。如果不想让别人知道内部的实现细节,那么就是private
如:
public:
count()
{ mycount();}
private:
mycount();
这样,count是对外的接口,而实现的时候,我们不想让外面知道怎么实现的,就用private,防止它用mycount。
如果不想让别人知道,想让自己的孩子什么的知道(这里涉及到继承),那么就可以作为protected
这样,private是自己私有的,protected是可以让孩子知道的,public是公开的!
三种访问控制的特点
private:只能由
1.该类中的函数
2.其友元函数访问
不能被任何其他访问,该类的对象也不能访问。
protected:可以被
1.该类中的函数
2.派生类的函数
3.以及其友元函数访问
但不能被该类的对象访问。
public:可以被
1.该类中的函数
2.派生类的函数
3.其友元函数访问
4.该类的对象访问
注:
友元函数包括3种:
设为友元的普通的非成员函数;
设为友元的其他类的成员函数;
设为友元类中的所有成员函数。
如果紧跟在类名称的后面声明私有成员,则关键字private可以省略:
class Clock
{
int Hour,Minute,Second;
public:
void SetTime(int NewH, int NewM, int NewS);
void ShowTime();
};
钟表类:
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 2pir;}
float GetArea(){ return pirr;}
private:
float r;
};成员数据
成员函数
成员数据:与一般的变量声明相同,但需要将它放在类的声明体中。
类定义和使用时应注意:
- 在类的声明中不能对数据成员进行初始化。
class Date
{
int d = 1;
int m = 10;
int y = 1949;
}; 这样是错误的!!!!!
//以后会讲到构造函数来解决这个问题 - 类的任何成员都必须指定访问属性,一般将数据成员定义为私有成员或保护成员,成员函数定义为公有成员
- 类中的数据成员可以是C++语法规定的任意数据类型,但不能用存储类型auto、register或extern进行修饰。
- 类的成员可以是其他类的对象,但不能以类自身的对象作
为本类的成员。 - 类定义必须以分号“;”
成员函数
可以在类中说明原型,在类外给出函数体实现,并在函数名前使用类名加以限定。
将成员函数在类外定义的一般形式是:
返回类型 类名∷成员函数名(参数表)
{
// 函数体
}
也可以直接在类内给出函数体,形成内联成员函数。
允许声明重载函数和带默认形参值的函数
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;
}
对象
类描述了一类问题的共同属性和行为。
类与对象的关系,如同C++基本数据类型和该类型的变量
之间的关系。
类的对象是该类的实例或实体,即类类型的变量。
类的对象声明形式:
类名 对象名;
例:
Clock myClock;
跟普通的变量一样,当定义对象时,申请存储空间(编译器
根据类的成员变量的定义分配存储空间)
(2)声明了类之后,在使用时再定义对象,定义的格式与一般变量的定义格式相同
例如:
class Coord {
//…
};
// …
main()
{
Coord op1,op2;
// …
}
(1)在声明类的同时,直接定义对象,即在声明类的右花括号“}”后,直接写出属于该类的对象名表。
例如:
class Coord {
public:
void setCoord(int,int);
int getx();
int gety();
private:
int x,y;
}op1,op2;
类中成员的访问方式:
类中成员互访
直接使用成员名
类外访问
使用“对象名.成员名”方式访问 public 属性的成
员
对象成员的引用
- 通过对象名和成员运算符访问对象成员
一般形式: 对象名.成员名
例如:
stud1.num=100;
stud1.display();
在类外只能访问public成员,不能访问private成员。
class Student
{
public:
int num;
char name[20];
char sex;
public:
void display();
} stud1;
2.通过指向对象的指针访问对象中成员
一般形式:指针名->成员名
如:
student stud1,*p;
p=&stud1;
cout<num;
注:p->num, (*p).num, stud1.num三者等价.
3.通过对象的引用访问对象中成员
如:
student stud1;
student &stud2=stud1;
cout<<stud2.num;
下面来看一个栗子:
下面是俺自己敲滴代码:
#include <iostream>
using namespace std;
double Pi=3.14159,x=35,y=20;
class pool //定义一个泳池类
{
public:
void poolr(double R);
double pools(); //圆面积
double poolc(); //圆周长
private:
double r;
};
void pool::poolr(double R)
{
r=R;
}
double pool::pools()
{
return Pi*r*r;
}
double pool::poolc()
{
return 2*Pi*r;
}
int main()
{
pool a,p; //a为泳池 p为泳池+过道
double b;
cin>>b;
a.poolr(b);
a.pools();
p.poolr(b+3);
p.pools();
p.poolc();
cout<<"泳池半径:"<<b<<endl;
cout<<"过道造价:"<<20*(p.pools()-a.pools())<<endl;
cout<<"栅栏造价:"<<p.poolc()*35<<endl;
return 0;
}
//运行结果:
/*
10
泳池半径:10
过道造价:4335.39
栅栏造价:2858.85
Process returned 0 (0x0) execution time : 3.829 s
Press any key to continue.
*/