一、对象
客观世界中任何一个事物都可以看成一个对象,每个对象都由属性(数据)和动作(函数)组成。

对象的组成:
1、数据:用于描述对象的属性;
2、函数:动作(操作代码),根据外界输入的信息操作对象的代码。
具有相同的属性和行为的对象抽象为类(class),类是对象的抽象,对象则是类的特例。
二、类的声明和对象的定义
1、形式一:在类内定义成员函数
class Student //类名
{
private: //数据成员(私有的)
int num;
char name[20];
char sex;
public:
void set_data(int n, char *p,char s) //成员函数,为私有数据成员赋值
{
num=n;
strcpy(name,p);
sex=s;
}
void display() //成员函数,输出私有数据成员
{
cout<<"num: "<<num<<endl;
cout<<"name: " <<name<<endl;
cout<<"sex: " <<sex<<endl<<endl;
}
}; //注:类的定义,结尾要加“;”
int main()
{
Student stud1,stud2; //定义对象
stud1.set_data(1,"John",'f'); //使用对象的成员函数,为对象的数据成员赋值
stud2.set_data(2,"Mary",'m'); //使用对象的成员函数,为对象的数据成员赋值
stud1.display();
stud2.display();
return 0;
}
2、形式二:在类外定义成员函数(推荐)
class Student //类名
{
private: //数据成员(私有的)
int num;
char name[20];
char sex;
public:
void set_data(int n, char *p,char s); //成员函数
void display(); //成员函数
};
void Student::set_data(int n, char *p,char s) //类外定义的成员函数
{
num=n;
strcpy(name,p);
sex=s;
}
void Student::display() //类外定义的成员函数
{
cout<<"num: "<<num<<endl;
cout<<"name: " <<name<<endl;
cout<<"sex: " <<sex<<endl<<endl;
}
int main()
{
Student stud1,stud2; //定义对象
stud1.set_data(1,"John",'f'); //使用对象的成员函数,为对象的数据成员赋值
stud2.set_data(2,"Mary",'m'); //使用对象的成员函数,为对象的数据成员赋值
stud1.display();
stud2.display();
return 0;
}
3、成员函数不一定非要定义为公有
class Time
{
public:
void set_time( );
void show_time( );
private:
bool is_time(int, int, int);//私有成员函数
int hour;
int minute;
int sec;
};
bool Time::is_time(int h,int m, int s)
{
if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)
return false;
return true;
}
void Time::set_time()
{
char c1,c2;
cout<<"请输入时间(格式hh:mm:ss)";
while(1)
{
cin>>hour>>c1>>minute>>c2>>sec;
if(c1!=':'||c2!=':')
cout<<"格式不正确,请重新输入"<<endl;
else if (!is_time(hour,minute,sec));
cout<<"时间非法,请重新输入"<<endl;
else
break;
}
};
三、类的成员函数
1、public&private成员函数
public成员函数:需要被外界调用的成员函数指定为public,它们是类的对外接口。
private成员函数:只被本类中的成员函数调用,以支持其他函数的操作,则将其指定为private。
本类的成员函数(无论public或private)都可访问本类中任何成员(包括私有的和公用的),可引用在本作用域中有效的数据。
2、inline 内置成员函数
一般只将规模很小、使用频繁的函数声明为内置函数。内置函数中不能包括复杂的控制语句。使用内置函数节省运行时间,却增加了目标程序的长度。成员函数在类体外定义,应当用inline对内置函数作显式声明。
class Student
{
public:
inline void display( );
private:
int num;
string name;
char sex;
};
inline void Student∷display( )
{
cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}
3、成员函数的存储方式
分开存储数据,共享函数代码

四、成员(数据&函数)的引用方法
私有成员(数据&函数)仅能在成员函数中引用,此时,直接使用成员名即可;
公共数据成员可在类外访问,但为了封装和信息隐藏,不提倡这样做;
公共成员函数可以在类外访问,这是对象与外界进行消息传递的途径(接口)。
1、访问对象中成员(函数&数据)的3种方法
1.1、通过对象名和成员运算符(.)访问对象中的成员
访问对象中成员的一般形式:对象名.成员名;
注:此方式仅可用于public的函数或数据成员,private成员不能使用此形式。
class Time
{
public:
void set_time( );
void show_time( );
int day; //注意:公有数据成员,允许外部直接访问
private:
int hour; //注意:私有数据成员,不允许外部直接访问
int minute; //注意:私有数据成员,不允许外部直接访问
int sec; //注意:私有数据成员,不允许外部直接访问
};
int main( )
{
Time t1;
t1.day = 28;//公有数据成员,才允许外部直接访问
t1.set_time( );//注意:必须指定对象名不能set_time()
t1.show_time( );////注意:必须指定对象名不能show_time()
Time t2;
t2.set_time( );
t2.show_time( );
return 0;
}
1.2、通过指向对象的指针访问对象中的成员
先定义一个与对象同类的指针,然后将此指针指向要被访问的对象,即可使用。
注:即便是通过对象的指针访问,但仍只能访问public成员,private成员依旧无法使用指向对象的指针进行直接访问。
class Time
{
public:
void set_time( );
void show_time( );
int day;
private:
int hour;
int minute;
int sec;
};
int main( )
{
Time t1, *p; //首先,定义对象类型的指针;
p=&t1; //其次,将该指针,指向对象t1;
t1.set_time( );
(*p).show_time( );//通过指针访问对象的成员函数
p->show_time( ); //通过指针访问对象的成员函数(建议此形式)
return 0;
}
1.3、通过对象的引用变量访问对象中的成员(不推荐)
引用变量共占同一段存储单元的,实际上它们是同一个对象,只是用不同的名字表示而已。
class Time
{
public:
void set_time( );
void show_time( );
private:
int hour;
int minute;
int sec;
};
int main( )
{
Time t1;
Time &t2=t1;//此方式定义:同一的对象,不同名字,占用同一段内存。
t1.set_time( );
t2.show_time( );
}
2、访问数据成员(私有)的常用方法
2.1、通过公共成员函数,访问私有数据成员
class Test
{
private:
int x, y;
public:
void setX(int a) {x=a;}
void setY(int b) {y=b;}
void printXY(void)
{cout<<"x="<<x<<'\t'<<"y="<<y<<endl;}
} ;
int main()
{
Test p1,p2;
p1.setX(3);//接口函数访问私有数据
p1.setY(5);//接口函数访问私有数据
p1.printXY( );
}
也可预先在类内,定义set/get成员函数设置和读取私有数据成员的值,如下:
class Test
{
private:
int x,y;
public:
void setX(int a) {x=a;} //设置x的值
void setY(int b) {y=b;} //设置y的值
int getX(void) {return x;} //返回x值
int getY(void) {return y;} //返回y值
};
int main()
{
Test p1,p2;
p1.setX(3);
p1.setY(5);
int a,b;
a=p1.getX();
b=p1.getY();
cout<<a<<'\t'<<b<<endl;
}
2.2、通过公共成员函数,利用指针将私有数据成员的值提取到类外
class Test
{
private:
int x,y;
public:
void setX(int a) {x=a;}
void setY(int b) {y=b;}
void getXY(int *px, int *py) //提取x,y值
{
*px=x;
*py=y;
}
};
int main()
{
Test p1;
p1.setX(3);
p1.setY(5);
int a,b;
p1.getXY(&a,&b); //将 a=x, b=y
cout<<a<<'\n'<<b<<endl;
}
2.3、利用引用将私有数据成员的值提取到类外
引用类似指针
class Test
{
private:
int x,y;
public:
void setX(int a) {x=a;}
void setY(int b) {y=b;}
void getXY(int &px, int &py) //引用!!!
{
px=x;py=y;} //提取x,y值
};
int main()
{
Test p1;
p1.setX(3);p1.setY(5);
int a,b;
p1.getXY(a, b); //将 a=x, b=y
cout<<a<<'\n'<<b<<endl;
}
五、类的封装与信息隐藏
1、类的公用接口
C++通过类来实现封装性,把数据和与这些数据有关的操作封装在一个类中;
在声明一个类以后,用户主要是通过调用公用的成员函数来实现类提供的功能——称为消息传递;
公用成员函数是用户使用类的公用接口(public interface),或者说是类的对外接口;
在类外不能直接访问私有数据成员,但可以通过调用公用成员函数来引用甚至修改私有数据成员。
2、类的私有实现和信息隐藏
通过成员函数对数据成员进行操作称为类的实现,实现的细节对用户是隐蔽的。
信息隐藏:用户只需知道调用哪个函数会得到什么结果,能实现什么功能即可,而不必关心这些功能实现的细节。
3、类的公用接口与私有实现的分离
将接口与实现分离是软件工程一个最基本的原则,类的公用接口与私有实现“分离”形成了信息隐蔽。
这样做的优点:
1)如果想修改或扩充类的功能,只需修改本类中有关的数据成员和与它有关的成员函数,程序中类外的部分可以不必修改。
2)如果在编译时发现类中的数据读写有错,不必检查整个程序,只需检查本类中访问这些数据的少数成员函数。
4、类声明和成员函数定义的分离

将类的声明放在指定的头文件中:
用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类
的声明(重复声明还会带来其他问题);在头文件中包含了类的声明,在程序中就可以用该类来定义对象,就可以调用这些对象的公用成员。
成员函数的定义另外放在一个文件中,与声明类的头文件分开:
类成员函数的定义一般不放在头文件中,而放在另一个文件中;内置函数(inline)的定义要写在头文件中;这种方式实现了信息隐蔽。
类库:
在实际工作中,并不是将每一个类声明做成一个头文件,而是将若干个常用的功能相近的类声明集中在一起,形成类库。不必每次都重复对所有代码进行编译,而只需编译一次即可。把编译后所形成的目标文件保存起来,以后在需要时把它调出来直接与程序的目标文件相连接即可。
两种C++类库:
C++编译系统提供的标准类库;
用户根据自己的需要做成的用户自定义类库,提供给自己和自己授权的人使用。
&spm=1001.2101.3001.5002&articleId=144270271&d=1&t=3&u=571bc12b1b1f4a2c965c26cfb2a67289)
6158

被折叠的 条评论
为什么被折叠?



