C++数据结构-结构体

目录

0.结构体的意义

1.定义结构体

2.使用结构体

3.结构体的成员函数

4.结构体指针

总结


0.结构体的意义

在C++中,有很多数据结构,如:int,float,double......这些都是官方的,但它们都只能存放一种数据类型。“ int ”存整数(-2147483648~2147483647);“ float ”存实数......

那我们自己能不能定义一个自己的数据类型呢,就像自定义函数一样?
答案是肯定的。在C++中,我们可以通过结构体(struct)来定义一个自己的数据类型,而且这个数据类型可以存多种数据。就像一个由不同类型的元素组成的数组。

1.定义结构体

讲了这么多,那到底如何定义结构体呢?看:

struct 结构体名
{
	类型 成员变量1;
	类型 成员变量2;
	....
};

 如:

struct A
{
    int a,b;
};

这里定义了一个名字叫“A”的结构(类型),这个“A”类型里有两个成员变量,对,就是“a、b”。这两个成员变量都是int类型的,它们和普通的int类型的变量一样,可以存整数。结构体的成员变量也可以是其他的类型,如float,char,double...甚至是数组!成员变量也可以有多个,但至少要有一个。

注意 “ } ” 后面有分号!

2.使用结构体

那这个结构体有什么用呢?它就是一个完整的结构,你可以像用官方的数据结构一样用它来定义变量。如:

struct A
{
    int a,b;
};
A t;

这里定义了结构体“A”,还用它定义了一个“t”的变量,就像int t;一样。如果要定义“t”,
除了可以“A t;”还可以这样:

struct A
{
    int a,b;
}t;

可以在定义完结构体后将变量写在“}”和“;”中间。

每个“A”类型的变量都有两个“int”类型的成员变量。那如何访问他们呢?

看:

所以,我们可以用“ . ”来访问一个结构体变量的成员变量,而且这里编译器给我们了两个选择,
“a”和“b”。我们可以这样:

struct A
{
    int a,b;
};
A t;

t.a=1;
t.b=2;

这段程序把1赋给了“t”的成员变量“a”;把2赋给了“t”的成员变量“b”。

除了用“ . ”来赋值,我们还可以这样:

struct A
{
    int a,b;
};
A t;

t={1,2};

这样赋值可以不用烦琐的重复写“t.a=1;t.b=2;”。看到这里,你有没有觉得结构体就像数组一样?没错,结构体可以看成元素是不同类型的数组

3.结构体的成员函数

我们之前说了结构体的成员变量,结构体也可以有成员函数。如:

struct A
{
    int a,b;
    int plus(int a,int b)
    {return a+b;}
}t;

t={1,2};
cout<<t.plus(t.a, t.b); //3
cout<<t.plus(1, 2);     //3

这段程序向我们展示了结构体成员函数的基础操作,但这也是普通自定义函数可以办到的,结构体成员函数的奇妙之处就是它可以这样:

struct A
{
    int a,b;
    int plus()
    {return a+b;}
}t,c;

t={1,2};
c={2,4};
cout<<t.plus(); //1+2=3    t.a+t.b
cout<<c.plus(); //2+4=6    c.a+c.b

看到了吗,结构体成员函数可以不用参数就能访问结构体成员变量,相当于是你在用“t.”的时候就把“t”当作参数传进去了(个人猜测)。

4.结构体指针

结构体类型也可以定义指针变量:

struct A
{
    int a,b;
}t,*p;

t={1,2};
p=&t;

上面的代码中,指针变量“*p”的每个成员变量分别存了“t”的每个成员变量的内存地址。请注意加粗的字。

那么我们如何通过指针访问成员变量呢?

方式一: (*指针名).成员名:

struct A
{
    int a,b;
}t,*p;

t={1,2};
p=&t;
if((*p).a==1) (*p).a=2;    //t.a=2
if((*p).b==1) (*p).b=3;    //t.b=2

方式二: 指针名 -> 成员名:

struct A
{
    int a,b;
}t,*p;

t={1,2};
p=&t;
if(p->a==1) p->a=2;    //t.a=2
if(p->b==1) p->b=3;    //t.b=2

注释里写了运行后的结果。

还记得结构体成员函数可以不用参数就能访问结构体成员变量吗?
官方的解释是这样的:

int plus()

{return a+b;}

但它应该是这样的:

int plus(const A *this)

{return this->a+this->b;}

大家一定注意到了出现了一个A类型的指针变量:“ this ”,就是加粗的部分。那它有什么用呢?官方的回答是:它存的内容是调用这个“ plus ”成员函数的变量的内存地址。

不过用“ this ”有一个需要注意的地方:我们不用写“ const A *this ”因为“ this ”已经是关键字了。

总结

1.我们可以自己定义一个数据结构,就是结构体。

2.结构体可以同时拥有多个成员变量、数组和成员函数。

struct 结构体名
{
	类型 成员变量1;
	类型 成员变量2;
	...
    类型 成员函数1(...){...}
    类型 成员函数2(...){...}
    ...
};

3.结构体可以定义指针变量。

4.有一个默认的指针“ this ”存的是调用成员函数的变量的内存地址。

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值