C++基础学习4

旧巷老猫 提交于 2019-11-28 07:20:48

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类和对象应用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!