C++基础五:引用与结构体

引用

1.引用的含义

引用是C++中一个强有力的语法,在编程时极为实用,函数的参数是作为局部变量的,对局部变量的操作不会影响外部的变量,如果想要修改传入的参数,那么只能用指针,而引用也可以达到修改传入参数的目的

引入不产生副本,而是给原变量起了个别名

假设我本名为ly,某天我用了好兄弟的别名byx,其实这两个名字说的都是同一个人(这两个名字都指向了同一个人),引用相当于给原来的变量又取了个别名,这样旧名字跟新名字其实都是指同一个东西,且对引用变量的操作就是对原变量的操作

引用的使用方法很简单,只需要在函数的参数类型后面加个&就可以了(&加在int后面或者变量名前面都可以,考虑到引用是别名的意思,因此一般写在变量名前面),示例如下

在上述代码中,在change函数的参数intx中加了&,在传入参数时对参数的修改就会对原变量进行修改,

注意:
(一)不管是否使用引用,函数的参数名和实际传入的参数名可以不同

(二)引用的&跟取地址运算符&区分开来,引用并不是取地址的意思

2.指针的引用

在上篇博客中我们试图通过将传入的地址交换来达到交换两个变量的效果,但是失败了,这是因为对指针变量本身的修改无法作用到原指针变量上,但使用引用可以实现原先要实现的效果,如下图

指针变量是unsigned类型的整数,因此为了理解上的方便,可以把int*型理解成unsigned int型,而直接交换这样的两个整型变量是需要加引用的

注意,由于引用是产生变量的别名,因此常量不可使用引用,于是调用上述函数时,不可以写成swap(&a,&b);

而必须用指针变量p1和p2存放&a和&b,然后把指针变量作为参数传入

结构体

1.结构体的定义

一个结构体的基本格式如下

当需要将一些相关的变量放在一起存储时,只要依次写出它们的数据类型和变量名称

例如,需要储存一个学生的学号、性别、姓名和专业,可以这样定义

struct student{

int id;

char gender;

char name[20];

char major[20];

}Alice,Bob,stu[1000];

其中student是这个结构体的名字,在大括号内分别定义了id(学号)、gender(性别)、name(姓名)、major(专业),这些都是单个学生的信息,而在大括号外定义了student型的Alice和Bob代表两个结构体变量,之后的stu[1000]就是当有很多学生时定义的一个结构体数组

定义结构体变量和结构体数组除了可以像上面直接定义外,也可以按照基本数据类型一样定义,如下图

注意,结构体里面能定义除了自己本身之外的任何数据类型,虽然不能定义自己本身,但可以定义自身类型的指针变量,如下图

访问结构体内的元素

访问结构体内的元素有两种方法,"."操作和"->"操作,示例如下

在上述结构体中多了一个指针next用来指向下一个学生的地址,且结构体变量中定义了普通变量stu和指针变量p

于是访问stu中变量的写法如下

而访问指针变量p中元素的写法如下

对结构体变量和结构体指针变量内元素的访问方式是一样的,在变量名后面加"."然后跟上要访问的元素即可,但对结构体指针变量中元素的访问有更简便的方式,格式如下

结构体指针变量内元素的访问只需要使用"->"跟上要访问的元素即可,且使用"."和"->"访问结构体指针变量内元素的写法是完全等价的

可以把stu.id赋值或者把stu.id赋值给其他变量

结构体的初始化

可以先定义一个结构体变量,然后对其中的元素逐一赋值,以达到初始化的目的,或者在读入时进行赋值

如果这样做,那么当结构体内变量很多时并不方便,此处介绍一种使用构造函数的方法来进行初始化

所谓构造函数就是用来初始化结构体的一种函数,它直接定义在结构体中,构造函数的一个特点是它不需要写返回类型,且函数名与结构体名相同

一般来说,对一个普通定义的结构体,其内部会生成一个默认的构造函数(不可见),例如下图

studentInfo( ){}是默认生成的构造函数,该函数名称和结构体名称相同,它没有返回类型,所以该函数前面没有写东西,它没有参数,所以小括号内是空的,它没有函数体,所以花括号内是空的

由于这个构造函数的存在,才可以直接定义studentInfo类型的变量而不进行初始化,因为它没有让用户提供任何初始化参数

如果想要自己手动提供id和gender的初始化参数,只需要像下面这样提供初始化参数来对结构体内的变量进行赋值即可,其中_id和_gender都是变量名

构造函数也可以简化为一行

这样就可以在需要时直接对结构体变量进行赋值

注意:
如果自己重新定义了构造函数,则不能不经初始化就定义结构体变量,即默认生成的构造函数此时已经被覆盖了,为了既能不初始化就定义结构体变量,又能享受初始化带来的便捷,可以手动加上studentInfo( ){}

只要参数个数和类型不完全相同,就可以定义任意多个构造函数,以适应不同的初始化场合,类似java创建对象

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值