7自定义数据类型
7.1结构体类型
用户可以自己声明的类型还有结构体(structure)类型、 共用体(union)类型、 枚举(enumeration)类型、 类(class )类型等, 这些统称为用户自定义类型 。
结构体是将不同类型的数据组合成一个有机的整体,这些组合在一个整体中的数据是互相联系的。
struct Student//声明一个结构体类型Student
{
int num;//包括一个整型变量num
char name[20];//包括一个字符数组name,可以容纳20个字符
char sex;//包括一个字符变量sex
int age;//包括一个整型变量age
float score;//包括一个单精度型变量
char addr[30];//包括一个字符数组addr,可以容纳30个字符
} ;//最后有一个分号
声明结构体类型的位置一般在文件的开头, 在所有函数(包括main函数)之前。
定义:
(1) 先声明结构体类型再定义变量名 。
Student student1, student2;
(2) 在声明类型的同时定义变量
(3) 直接定义结构体类型变量
结构体变量的初始化 ,可以在定义时指定初始值。
结构体变量的引用
(1) 可以将一个结构体变量的值赋给另一个具有相同结构的结构体变
量。
student1= student2;
(2) 可以引用一个结构体变量中的一个成员的值。
student1.num=10010;
(3) 如果成员本身也是一个结构体类型,则要用若干个成员运算符,
student1.birthday.month=12;
(4) 不能将一个结构体变量作为一个整体进行输入和输出。
结构体数组
定义结构体数组和定义结构体变量的方法相仿, Student stu[3];
指向结构体变量的指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。 也可以用来指向结构体数组中的元素。
p->num
stu.num
(*p).num//等价。
用结构体变量和指向结构体变量的指针构成链表
链表中的每一个元素称为“结点”,每个结点都应包括两个部分:
一是用户需要用的实际数据,
二是下一个结点的地址。
所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为静态链表。
动态链表则是指各结点是可以随时插入和删除的, 这些结点并没有变量名,只能先找到上一个结点,才能根据它提供的下一结点的地址找到下一个结点。
结构体类型数据作为函数参数
(1) 用结构体变量名作参数。一般较少用这种方法。
(2) 用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
(3) 用结构体变量的引用变量作函数参数。
动态分配和撤销内存的运算符
new运算符使用的一般格式为
new 类型 [初值]
用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。
delete运算符使用的一般格式为
delete [ ] 指针变量 ,在指针变量前面加一对方括号,表示是对数组空间的操作 。
7.2共用体
几个不同的变量共占同一段内存的结构,称为共用体(union )类型的结构 。
声明共用体类型的一般形式为
union 共用体类型名{成员表列};
定义共用体变量的一般形式为
共用体类型名 共用体变量名;
不能引用共用体变量,而只能引用共用体变量中的成员。
特点:
在每一瞬时只能存放其中一种,而不是同时存放几种 。
能够访问的是共用体变量中最后一次被赋值的成员,在对一个新的成员赋值后原有的成员就失去作用。
共用体变量的地址和它的各成员的地址都是同一地址。
不能对共用体变量名赋值;不能企图引用变量名来得到一个值;不能在定义共用体变量时对它初始化;不能用共用体变量名作为函数参数。
7.3枚举类型
如果一个变量只有几种可能的值, 可以定义为枚举(enumeration)类型。
enum weekday{sun, mon, tue, wed, thu, fri, sat};
定义枚举类型 变量
weekday workday,week_end;
7.4用typedef声明类型
用typedef声明一个新的类型名来代替已有的类型。
typedef int INTEGER; //指定用标识符INTEGER代表int类型
typedef float REAL; //指定用REAL代表float类型
8类和对象
8.1面向对象程序设计概述
凡是具备属性和行为这两种要素的,都可以作为对象。
调用对象中的函数就是向该对象传送一个消息(message),要求该对象实现某一功能。
封装处理,就是把它的一部分属性和功能对外界屏蔽。
抽象的过程是将有关事物的共性归纳、集中的过程。抽象的作用是表示同一类事物的本质。 对象则是类的具体表现形式。
多态性(polymorphism)是指: 由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。
8.2类的声明与对象定义
class Student //声明类类型
{private : //声明以下部分为私有的
int num;
char name[20];
char sex;public : //声明以下部分为公用的
void display( )
{cout<<″num:″<<num<<endl;
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;}
};
Student stud1,stud2;//定义了两个Student类的对象
如果在类的定义中既不指定private,也不指定public,则系统就默认为是
私有的。
protected(受保护的), 它不能被类外访问(这点与私有成员类似),但可以
被派生类的成员函数访问。
定义对象
1.先声明类类型,然后再定义对象
class Student stud1,stud2;或
Student stud1, stud2;
2.在声明类类型的同时定义对象。
3.不出现类名,直接定义对象。
用struct
声明的类,如果对其成员不作private或public的声明,系统将其默认为public。
8.3类的成员函数
在使用类函数时, 要注意调用它的权限(它能否被调用)以及它的作用域 。
在类外定义成员函数
class Student
{ public :
void display( );//公用成员函数原型声明
private :
int num;
string name;
char sex;//以上3行是私有数据成员
};
void Student∷ display( )//在类外定义display类函数
{cout<<″num:″<<num<<endl;//函数体
cout<<″name:″<<name<<endl;
cout<<″sex:″<<sex<<endl;
}Student stud1,stud2;//定义两个类对象
成员函数在类外定义时,必须在函数名前面加上类名,予以限定, “∷ ”是作用域限定符或称作用域运算符,用它声明函数是属于哪个类的。
类函数必须先在类体中作原型声明,然后在类外定义。
inline
成员函数
在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。
class Student
{public :
void display( )
{cout<<″num:″<<num<<endl;cout<<″name:″
<<name<<endl;cout<<″sex:″<<sex<<endl;}
private :
int num;
string name;
char sex;
};
其中第3行
void display( ) 也可以写成
inline void display( )
成员函数的存储方式
一个对象所占的空间大小只取决于该对象中数据成员所占的空间,而与成员函数无关。
函数代码是存储在对象空间之外的。如果对同一个类定义了10个对象,这些对象的成员函数对应的是同一个函数代码段,而不是10个不同的函数代码段 。
8.4对象成员的引用
通过对象名和成员运算符访问对象中的成员;
通过指向对象的指针访问对象中的成员;
通过对象的引用变量访问对象中的成员。
stud1.num=1001;//公有成员
class Time
{
public : //数据成员是公用的
int hour;
int minute;
};Time t,*p;//定义对象t和指针变量p
p=&t;//使p指向对象t
cout<<p->hour;//输出p指向的对象中的成员hour
p->hour, (*p).hour和t.hour
三者等价。
Time t1; //定义对象t1
Time &t2=t1;//定义Time类引用变量t2,并使之初始化为t1
cout<<t2.hour;//输出对象t1中的成员hour
8.5类的封装和隐蔽
用户主要是通过调用公用的成员函数来实现类提供的功能 。
类声明和成员函数定义的分离
将类的声明 放在指定的头文件中,类成员函数的定义一般不放在头文件中,而另外放在一个文件中。
//student.h (这是头文件,在此文件中进行类的声明)
class Student //类声明
{ public :
void display( );//公用成员函数原型声明
private :
int num;
char name[20];
char sex;};
//student.cpp
//在此文件中进行函数的定义
#include <iostream>
#include ″student.h″//不要漏写此行,否则编译通不过
void Student∷ display()//在类外定义display类函数
{cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;
}
//main.cpp 主函数模块
#include <iostream>
#include ″student.h″ //将类声明头文件包含进来
int main( )
{Student stud;//定义对象
stud.display( );//执行stud对象的display函数
return 0;
}
8.6类和对象应用
来源:https://blog.csdn.net/qq_28691955/article/details/100030836