自定义数据类型(C++谭浩强第三版笔记)_惺忪牛犊子的博客-程序员秘密

技术标签: # C++  

用户自定义类型(user-defined type ,UDT):

结构体(structure)、共用体(union)类型、枚举(enumeration)类型、类(class)类型等。

一、结构体(structure)

  结构体:在一个组合项中包含若干个类型不同(也可相同)的数据项。

1.1 一般形式:

        struct 结构体类型名
          { 成员表(域表)};

1.2 定义结构体类型变量的方法

方法一:先声明结构体类型再定义变量;
方法二:声明类型同时定义变量;

如:

struct Student      //声明一个结构体类型 Studentint num;         //每个成员(或称一个域)                
   char name[20];   //类型名  成员名
   char sex;
   int age;
   float score;
   char addr[30];;         //定义变量,方法二:将 【;】改为  【student 1,student2;】 
Student student1 ,student2;    //定义变量,方法一

1.3 引用结构体变量:

方法一:可将结构体变量赋值给另一相同结构体变量。如:student1=student2;
方法二:可引用结构体变量中一个成员的值。如:student1.num =10010;
  可得一般形式为:结构体变量名.成员名

1.4 结构体数组

结构体数组:每个数组元素都是一个结构体类型的数据,都分别包括各个成员项目。
如: Person leader[3]={"LI",0,"Zhang",0; //定义Person类型的数组。内容为名字和得票数。

1.5 指向结构体变量的指针:

一个结构体变量的指针:该变量所占据的内存段的起始地址。
设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。

指向结构体变量的运算符:“—>”称为指向运算符。

三种等价形式
1.结构体变量.成员名。 如:stu.num。
2.(*p).成员名。 如:(*p).num。
3. p—>成员名。 如:p—>num。

1.6 用 结构体变量指向结构体变量的指针 构成链表

#include<iostream>
struct student
{
      int num;
   float score;
   struct student *next;
};
int main()
{
      student a,b,c,*head,*p;
   a.num = 31001;a.score =89.5;
   b.num = 31003;b.score =90;
   c.num = 31007;c.score =85;
   head =&a;        			 		 /将结点a的起始地址赋予头指针head
   a.next =&b;       					 /将结点b的起始地址赋予a结点的next成员
   b.next =&c;      			 		 /将结点c的起始地址赋予b结点的next成员
   c.next =NULL;     	   				 /结点的next成员不存放其他结点地址
   p =head;         					 /使p指针指向a结点
   do
   {
     cout<<p->num<<" "<<p->score<<endl;  /输出p指向的结点的数据
     p=p->next;                          /使p指向下一个结点
   }while(p!=NULL);                      /输出完c结点后p的值为NULL
   return 0;
}

以上这种链表称为:静态链表,即:所有结点(结构体变量)都是在程序中定义的,不是临时开辟的,也不能用完后释放。

动态链表:各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找上一个结点,才能根据它提供的下一个结点的地址找到下一个结点。只有提供第一个结点的地址,即头指针head,才能访问整个链表。

1.7 一个结构体变量中的数据传递给另一个函数,方法有三:

方法一:用结构体变量名作参数。(一般很少用这种方法)
方法二:用指向结构体变量的指针作实参,将结构体变量的地址传给形参。
方法三:用结构体变量的引用作函数形参,它就成为实参(是结构变量)的别名。
课本P200有三个实例。

1.8 用new和delete运算符进行动态分配和撤销存储空间

C语言(C++保留):利用库函数 mallocfree来分配和撤销内存空间。
C++:用newdelete运算符来取代。

注:
  1.new运算符:动态分配内存。 delete运算符:释放已经分配的内存空间。
  2.new与delete可适用于任何情况,但malloc与free却很多时候不适用。
  原因:在类当中,malloc不会调用类的构造函数,而new会调用类的构造函数,同样道理,free不会调用类的析构函数,而delete会调用类的析构函数。

new运算符的一般格式

             指针变量 = new 类型 (常量)
             指针变量 = new 类型 [表达式]

注:
  1.常量是初始值可以缺省。
  2.用new分配数组空间时不能指定初值。
  3.作用:从堆分配一块类型大小的存储空间,并返回初始值。

delete运算符的一般格式

             delete 指针变量(对变量)
             delete[ ] 指针变量(对数组)
注:
  指针变量必须是一个new返回的指针,其实malloc返回的指针也是可以的。

关于new和delete的用法:

new int ;        /开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)
new int(100);    /开辟存放一个整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址
new char[10] ;   /开辟一个存放字符数组(包含10个元素)的空间,返回字符数组首元素的地址
new int[5][4];   /开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址
float *p = new float(3.14159)      
/开辟一个存放单精度数的空间,并指定该数的初值为3.14159,将返回的该空间的地址赋给指针变量P

二、枚举(enumeration)类型:

枚举(enumeration)类型:若一个变量只能有几种可能的值,则可定义枚举类型。
所谓“枚举”是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
声明枚举类型的一般形式
          enum 枚举类型名 [枚举常量表];
说明
  1.枚举元素按常量处理,故称枚举常量。(不能赋值,值是固定的)
  2.枚举元素作为常量是有值的,其值为整数,按定义时的顺序赋值0,1,2,3,…(也可以申明时指定元素的值)。
  3.枚举值可做判断比较,按整数比较规则。
  4.不可对枚举变量直接赋整数,只接受枚举类型数据。

三、类(class)和对象

四、用typedef声明新的类型名

用typedef声明一个新的类型名来代替已有的类型名:

typedef int INTEGER; //指定用标识符INTEGER代表int
//故而以下两行等价
int i,j;
INTEGER i,j;

归纳:
声明一个新类型名的方法【数组】:
1.先按定义变量的方法写出定义语句(如 int i;)【int n[100];】。
2.将变量名换成新类型名(如 将i换COUNT,即 int COUNT)【int NUM[100];】。
3.在最前面加typedef(如 typedef int COUNT)【typedef int NUM[100];】。
4.然后可用新类型名(如 COUNT)去定义变量【NUM n;(n是包含100个整型元素的数组)】。

注:
1.typedef只对已存在的类型增加一个类型名,没有创造新的类型。
2.可用typedef声明新类型名,但不能用来定义变量。
3.用typedef声明数组类型、字符串类型,比较方便。
4.用于不同系统之间移植更改效率高,正常将定义类型单独放在一个头文件,使用方便。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42645653/article/details/106818908

智能推荐

人工智能命题逻辑--测试题答案(三)_RobotMujie的博客-程序员秘密

1.如果命题p为真、命题q为假,则下述哪个复合命题为真命题(B) A.p且q B.如果q则p C.非p D.如果p则q 2.p和q均是原子命题,“如果p那么q”是由p和q组合得到的复合命题。下面对“如果p那么q”这一复合命题描述不正确的是( A) A.无法用真值表来判断“如果p那么q”的真假 B....

css简析_父元素:宽度1200px高度300px,背景黑色,居中显示:子盒子:左浮动,背景色,宽度39_builder2991的博客-程序员秘密

css选择器标签选择器:针对一类标签(如:body,div,p,ul,li)ID选择器:针对某一个特定的标签使用(如:id=“demo”)类选择器:针对你想要的所有标签使用(如:class=“demo”)通用选择器(通配符):针对所有的标签都适用(如:*号)后代选择器(继承选择器):用空格隔开(如:div p,注意两选择器用空格键分开)交集选择器(组合选择器):(如:.head .head_logo,注意两选择器用空格键分开)。并集选择器:(群组选择器):用逗号隔开伪类选择器:(如:就是链

完美解决!隐藏listview的headerView,实现动态下拉,(仿ios)_隐藏listview header_CameloeAnthony的博客-程序员秘密

这两天在做项目的 时候遇到了这个问题,发现网上也有人提出了这个问题,但是根本没有人去解决,可能是问题太简单了。我在这里贴上我的代码,以往对大家有帮助。首先,实现的效果,希望是这样的。网上也给出了一些解决方案,但是根本没有实现动态的下拉呀。(下面贴出网上解决方案的截图)接下来再来描述一下问题。我要实现的是listview的headerview 一开

python 标准日志模块loging 及日志系统实例_dianqianwei8752的博客-程序员秘密

本文出处:https://www.cnblogs.com/goodhacker/p/3355660.html#undefined  python的标准库里的日志系统从Python2.3开始支持。只要import logging这个模块即可使用。如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: 1 import logging 2 ...

vue获取当前时间,精确到时分秒,并实时刷新_听闻余生ssn的博客-程序员秘密

&lt;template&gt; &lt;div class="time"&gt; &lt;span&gt;{{nowTime}}&amp;nbsp&lt;/span&gt; &lt;span&gt;{{nowWeek}}&lt;/span&gt; &lt;/div&gt;&lt;/template&gt;&lt;script&gt;export default { data () { return { nowTime: '',

win10开启linux系统服务,Linux运维知识之win10下Linux子系统开启ssh服务_沼泽无它的博客-程序员秘密

本文主要向大家介绍了Linux运维知识之win10下Linux子系统开启ssh服务,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。虽然win10自带的bash功能已经很丰富,操作也简便,不过习惯了用xshell, 还是选择用xshell来操作直接用xshell连接127.0.0.1 端口22 提示连接失败。说明应该是ubuntu的sshd服务设置有问题:解决方案如下:安装ss...

随便推点

Mark:UFLDL反向传播算法及其检验调试方法——适合自己的才是好的_17420的博客-程序员秘密

人工智能、机器学习泛滥。以前搜不出来,现在搜出来的太多。找自己想看的都得费半天劲。这当然是好的,有资料总比没有强。但是搞这个方向,适合自己的才是好材料。太简单,你觉得不过瘾,太深奥,你看不懂,所以文章,刚好讲到你的困惑点,对你来说才是好文章。我自己觉得,反向传播方法,UFLDL里的讲解比较适合我,通篇没有废话,简单直接,写的非常好,所以Mark一下,免得下次忘了UFLDL这个关键词,又费半...

Oracle 游标的where current of子句_current of oracle_ETIpiero的博客-程序员秘密

游标中的更新和删除   在PL/SQL中依然可以使用UPDATE和DELETE语句更新或删除数据行。显式游标只有在需要获得多行数据的情况下使用。PL/SQL提供了仅仅使用游标就可以执行删除或更新记录的方法。  UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。要使用这个方法,在声明游标时必须使用FOR

java发送邮件控制字体_javamail 发送邮件demo(文字与附件)_尼不要逗了的博客-程序员秘密

packagecom.get.one;importjavax.mail.BodyPart;importjavax.mail.Message;importjavax.mail.Multipart;importjavax.mail.Session;importjavax.mail.Transport;import javax.mail.internet.*;import java.util.*;imp...

记RestTemplate使用,简单优雅的调用http接口_resttemplate.getinstance_qq_33786270的博客-程序员秘密

客户端代码,有问题欢迎指出,新手package com.qc.exp.common.util;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;impo...

10、游标(Cursor)的定义及使用_游标的定义和使用_不善表演的博客-程序员秘密

在 MySQL 中,存储过程或函数中的查询有时会返回多条记录,而使用简单的 SELECT 语句,没有办法得到第一行、下一行或前十行的数据,这时可以使用游标来逐条读取查询结果集中的记录。游标在部分资料中也被称为光标。关系数据库管理系统实质是面向集合的,在 MySQL 中并没有一种描述表中单一记录的表达形式,除非使用 WHERE 子句来限制只有一条记录被选中。所以有时我们必须借助于游标来进行单条记录的数据处理。一般通过游标定位到结果集的某一行进行数据修改。结果集是符合 SQL 语句的所有记录的集合。

推荐文章

热门文章

相关标签