首页 > 编程 > C++ > 正文

c++的面向对象基础 Day 2

2019-11-08 19:39:49
字体:
来源:转载
供稿:网友

概述

c++不仅扩充了c面向过程的功能,而且增加了面向对象的功能,这就是c++成为能适应面向对象程序设计的现代大语言。从计算机的角度,一个对象应该包括两个要素:一是数据,二是需要进行的操作。传统的面向过程程序设计是围绕功能进行的,用一个函数实现一个功能。所有的数据都是公用的,一个函数可以使用任意一组数据,而一组数据又能被多个函数所使用。面向对象程序设计采用新的思路,它面对的是一个个对象,所有的数据分别属于不同的对象。面向对象的程序设计方法的一个重要的特点就是封装性,把数据和操作代码封装在一个对象中。程序设计者的任务包括两个方面:一是设计对象,即决定把哪些数据和操作代码封装在一个对象中,二是在此基础上怎样通知有关对象完成所需的任务。

类和对象

对象的类型为类,类代表了某一批对象的共性和特征。类是对象的抽象,而对象是类的具体实例。 class stud { int num; char name[10]; char sex; void display() { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } }; stud stud1,stud2;

这就声明了一个名为 stud的类。可以看到声明类的方法是由声明结构体类型的方法发展而来的。它除了包含数据部分以外,还包括了对这些数据的操作部分,也就是把数据和操作封装在一起。display是一个函数,用来输出本对象中学生的学号、姓名和性别。类除了具有封装性外,还采用了信息隐蔽原则,使类的成员与外界的联系减少到最低程度。但是还是需要有外界的接口,一般是把数据隐藏起来,而把成员函数作为对外界的接口。接着,就有了类的成员包括两大类:一类是私有的;一类是公有的,还有一类是受保护的。

class stud { PRivate: int num; char name[10]; char sex; public: void display() { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl; } }; stud stud1,stud2;

现在声明了display函数是公用的,外界就可以调用该函数了。 介绍在面向对象程序设计中的几个名词,类中的成员函数称为方法,方法是对数据的操作,一个方法对应一种操作。显然只有被声明为public的方法(成员函数)才能被对象外界所激活。外界是通过发消息来激活有关方法的。所谓消息,其实就是一个命令,由程序语句来实现的。例如想输出对象stud1中的学生学号、姓名、性别等信息,可以在程序中写

stud1.display();

这就是向对象发出的一个消息,通知它执行display方法。 三个概念:对象 、方法、消息

归纳以上对类型的声明,可以得到其一般形式: class 类名 {private: 私有的数据和成员函数; public: 公用的数据和成员函数; };

构造函数和析构函数

1、构造函数 在建立一个对象时,常常需要作某些初始化的工作(例如对数据赋予初值),C++提供了一种特殊的成员函数–构造函数(constructor),这种函数与其他成员不同,不需要用户发消息来激活它,而是在建立对象时自动执行,构造函数是由用户定义的,它必须与类名同名,以便系统能识别它并把它作为构造函数。现在我们在前面声明的类中加入构造函数。

class stud //声明一个类,以class开头{private: //私有的数据和成员函数 int num; char name[10]; char sex; //以上三行是数据成员 public: //公用的数据和成员函数 stud() //定义构造函数,函数名与类名相同 {num=10010' strcpy(name,"Wang_li"); sex='F';} //给数据赋初值void display() //这是成员函数{cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl;}};stud stud1; //在定义对象stud1时自动执行构造函数;

==注意:构造函数不需要用户调用,而是在定义一个对象时系统自动执行,而且只能执行一次。构造函数一般声明为public,无返回值,也不需要加void类型声明。

#include<string.h>#include<iostream.h>void main(){ class stud { private: int num; char name[10]; char sex; public: stud() {num=10010; strcpy(name,"Wang_li"); sex='F';} void display() {cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl;} }; stud stud1; stud1.display(); //cout<<stud1.num;}

如果要建立两个对象,分别对数据赋予初值,就不能这样定义构造函数stud了,因为它会使两个学生的初值相同,例如姓名都是Wangli。应该分别赋予不同的初值,可将构造函数修改如下:

stud(int n,char nam[],char s){num=n; strcpy(name,nam); sex=s;}

完整程序即为

#include<iostream.h>void main(){ class stud { private: int num; char name[10]; char sex; public: stud(int n,char nam[],char s)//定义构造函数,有形参 {num=n; strcpy(name,nam); sex=s; } void display() {cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl;} }; stud stud1(10010,"Wang_li",'f'),stud2(10011,"Zhang_fen",'m'); stud1.display(); stud2.display(); //cout<<stud1.num;}

用户也可以不定义构造函数,编译系统会自动生成一个构造函数,该函数没有参数,不进行任何操作。

构造函数也可以重载,下面是两个重载函数:

stud()//定义构造函数,无形参 {num=10010; strcpy(name,"Wang_li"); sex='f'; } stud(int n,char nam[],char s)//定义构造函数,有形参 {num=n; strcpy(name,nam); sex=s; }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选