当前位置:文档之家› 《C++面向对象程序设计基础》实验报告

《C++面向对象程序设计基础》实验报告

西安交通大学《C++面向对象程序设计基础》实验报告学院:电子与信息工程学院班级:计算机科学与技术3x班学号:213姓名:指导教师:一、面向对象的程序设计1.1基本概念面向对象的程序设计是通过对类、子类和对象等的设计来体现的,类是面向对象程序设计技术的核心。

类:定义了对象特征以及对象外观和行为的模板。

类的特征:封装性:隐藏了类中对象的内部数据或操作细节,只看到外表信息。

继承性:任何类都可以从其它已有的类中派生,新类保持了父类中的行为和属性,但增加了新的功能。

体现了面向对象设计方法的共享机制。

多态性:相同的操作可作用于多种类型的对象上,并获得不同的结果。

抽象性:提取一个类或对象与众不同的特征,而不对该类或对象的所有信息进行处理。

基类:系统本身提供的类称为基类。

基类包括容器类和控件类。

容器类是其他对象的集合,如表格、选项按钮组;控件类是单一的对象,不包含其他对象,如命令按钮、文本框。

子类:以其他类定义为起点,对某一对象所建立的新类。

新类将继承任何对父类所做的修改。

二、C++语言基础2.1C++既可以用于面向过程的结构化程序设计,也可用于面向对象的程序设计。

C++对C的增强体现在两个方面:1.对原来的面向过程机制做了扩充。

2.增加了面向对象的机制。

学习C++之后,既可以进行面向对象的程序设计,也可以进行面向过程的程序设计。

2.2为了与C兼容,C++保留了C语言中的一些规定,例如头文件的文件名,以C语言里头文件的扩展名是.h,许多C++编译系统保留了这种扩展名,近年推出的C++编译系统新版本,推出了一批不带扩展名的头文件如iostream,string ,cmath 等。

为了兼容C++仍允许使用带扩展名的头文件。

由于C语言无命名空间,因此使用带扩展名的头文件时不用using namespace std。

2.3C++相对与c程序来说变化不大。

头文件从原来的studio.h 文件变成了iostream 标准输入输出流文件,从而输入输出方式也从printf、Scanf,变成cin、cout 。

虽然cin 、cout 输入输出方式简单,但格式设计不方便,而且耗时较大。

本质上,c++与c程序区别不大,两者主要区别在于c++使用全新的面向对象思想。

2.4C++基本数据类型有整数类型(int)、字符类型(char)、浮点类型(float)和双精度类型(double)、布尔类型(bool)、空类型(void)六种类型。

2.5C++中的表达式有算术表达式(+、-、*、/、%)、赋值表达式(=)、增量表达式(++和--)、关系表达式(>、<、>=、<=、!=)、逻辑表达式(!、&&、||)、条件表达式(操作数1?操作数2:操作数3)、逗号表达式(操作数1,操作数2,…,操作数n)。

2.6C++中的基本语句有空语句({})、表达式语句、声明语句、条件(if)语句、switch语句、循环语句(for循环语句、while循环语句、do-while循环语句、break语句、continue语句)。

三、类和对象3.1类是一个全新的概念,与c程序中结构体类似,但与其不同的是类中自带类内函数且在类中数据成员和成员函数的类型分为三种:public、private、protected,这三种数据类型有不同的访问权限:public可以被外界直接调用,而private与protected 需要通过函数才能被使用。

类对象:在C++中,对象是类的实际变量。

对象的使用格式有对象名.数据成员名/成员函数名(实参表)。

在类的外部,只有公有数据成员和公有成员函数才可以通过类的对象进行访问,而私有数据成员和成员函数只能在类的内部被访问。

3.2构造函数和析构函数:构造函数和析构函数使类对象能够轻松被创建和撤销。

构造函数创建类对象,初始化类成员,析构函数撤销类对象。

它们是类的特殊成员函数。

3.3对象数组与对象指针:对象数组就是每一个数组元素都是类的对象的数组,对象指针就是用于存放对象地址的变量。

对象数组定义的一般格式是类名对象数组名[下标表达式],使用方法是对象数组名[下表表达式].成员名,对象指针的声明方式是类名*对象指针名。

四、静态成员与友元4.1在类定义中,类的成员可以用关键字static声明为静态的,这些成员就是静态成员,它被这类所有对象共享。

类的私有成员只能在类的内部被访问,在外部要访问时,友元机制提供了很好的途径和方法。

4.2(a)友元函数:不是类的成员函数,在外部定义时,不需要加上(::)。

在声明为友元函数时,需要在其函数名前加上关键字friend。

(b)友元成员:一个类的成员函数要声明为另一个类的友元函数时,必须要先定义这个类。

(c)友元类:友元类的声明方法是在另一个类中加入形如“friend class 类名”的语句。

当一个类做另一个类的友元时,友元类中的所有成员函数都可以访问另一个类的所有成员(包括私有成员)。

五、派生类与继承5.1继承是在已有类的基础上创建新类的过程,新类就是派生类,已有类就是基类。

派生类不仅可以继承基类的功能,而且还能对基类的功能进行扩充、修改或重定义。

5.2派生类:派生类有三种继承方式,公有继承(public)、私有继承(private)、保护继承(protect)。

对于public继承,基类的public和protect成员分别继承为派生类的public和protect成员,基类的private成员在派生类中被隐藏。

5.3继承:继承有单一继承和多重继承两种方式。

单继承的定义格式是class 派生类名:继承方式基类名{…}。

多重继承的声明方式是class 派生类名:继承方式1 基类名1,继承方式2 基类名2,……,继承方式n 基类名n{…}。

在C++中,要使公共基类只产生一个拷贝,应该把这个基类声明为虚基类。

使用关键字virtual,语法形式是class 派生类名:virtual 继承方式基类名{…}。

六、多态性6.1多态:多态性是指用一个名字定义不同的函数,这些函数执行不同但又类似的操作。

这样可以极大地提高代码利用效率。

6.2重载:函数重载,c++允许定义多个同名函数,只要这些函数属于不同的类或有不同的参数列表(类型,个数或不同类型参数的顺序至少有一个不同)。

在调用重载函数时,为某类操作取一个通用的名字,而由编译器解决具体由哪个函数来执行。

(析构函数无法重载)运算符重载:通过运算符重载可以使运算符在不同的上下文有不同的含义,便于程序功能的实现与修改。

三大原则:1.重载不改变优先级2.重载不改变运算符操作数个数3.重载不能创造新运算符6.3模板:模板可以利用以下的代码实现Template<class T> \\class也可以换为typename函数模板:模板函数可以实现多个不同类型的函数运用同种功能。

模板的使用可以进行显示实例化与隐式实例化,同时,函数模板也可以进行重载。

类模板:定义一个类模板是以关键字template开始,定义格式是:template<class 类型参数>Class 类名{……};七、虚函数当通过基类指针或引用将派生类对象作为基类使用时,覆写机制会失效,即只能访问基类中定义的成员。

定义虚函数的方法是Virtual 返回类型函数名(参数表){、函数体}在派生类中重新定义时,该函数的函数原型(包括返回类型,函数名,参数列表)必须与基类中的函数原型完全相同。

注意,一个类的构造函数不能是虚函数,析构函数可以为虚函数。

八、实验内容1.输入3个整数,按由小到大的顺序输出输入输出格式如下:输入:2 1 3输出:1 2 3设计程序如下:#include <iostream>using namespace std;int main(){int a,b,c,*p1,*p2,*p3,*p;cin>>a>>b>>c;p1=&a;p2=&b;p3=&c;if(a>b) {p=p2;p2=p1;p1=p;}else {if(b>c) {p=p3;p3=p2;p2=p;}if(a>c) {p=p3;p3=p2;p2=p;}}cout<<*p1<<" "<<*p2<<" "<<*p3;return 0;}2.输入3个字符串,按由小到大的顺序输出输入输出格式如下输入cbaabcbac输出abcbaccba设计程序如下:#include <iostream>#include<string>using namespace std;int main(){string a1,a2,a3,temp;cin>>a1>>a2>>a3;if (a1>a2){temp=a1;a1=a2;a2=temp;} if (a3<a2){if (a3<a1)cout<<a3<<endl<<a1<<endl<<a2; elsecout<<a1<<endl<<a3<<endl<<a2;}elsecout<<a1<<endl<<a2<<endl<<a3;return 0;}3.写一函数,将一个3X3的矩阵转置提示:矩阵可存放到二维数组中,用指针完成数的交换(swap)操作输入输出示例如下输入1 2 34 5 67 8 9输出1 4 72 5 83 6 9设计程序如下:#include <iostream>using namespace std;int main(){ int i,j,t;int a[3][3],(*p)[3],*q;for(i=0;i<3;i++)for(j=0;j<3;j++)cin>>a[i][j];p=a;q=a[0];for(i=0;i<3;i++)for(j=i;j<3;j++){ t=*(q+3*i+j);*(q+3*i+j)=*(q+3*j+i); *(q+3*j+i)=t; }for(p=a;p<a+3;p++){q=*p;cout<<*q<<" ";q++;cout<<*q<<" ";q++;cout<<*q<<endl; }return 0;}4.写一个函数,实现两个字符串的比较。

相关主题