您的位置:首页 > 编程语言 > C语言/C++

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

2017-02-16 09:56 239 查看

概述

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;
}


完整程序即为

hljs cpp">#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: