目录
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 ”存的是调用成员函数的变量的内存地址。