最近有网友私信我,让我出一期关于结构体的博文,对结构体的基本结构进行讲解,但是由于结构体本身跟指针、跟数组都能搭上关系,所以博主准备出三期结构体的博文,对结构体的讲解进行分别的讲解。
话不多说,我们开始对结构体进行学习吧。前提:在学任何的新的知识的时候,首先对概念进行理解,只有对概念有正确和充分的理解,才能够正确的去使用对应的工具(关键字)
一、结构体的定义
结构体实际就是一种结构,其中成员列表由若干个成员组成,每个成员都是该结构的一个组成部分。
结构体的定义格式: struct 结构体名{属性名;};
理解:我们可以理解为一种模板,但同时,我们又可以把它看作是一种自定义的类型,正如同int型,short型,char型,这样的关键字来使用。后期我们所学习到的(类)class实际上在结构上跟(结构体)struct就非常类似。
struct是关键字,而struct后的结构名就是人为设定的,并且该结构体名字我们可以看做是一种模板,一种有属性的模板。
比如:我们想创建一种动物的模板,这个动物的属性有:名字,体重,年龄
因此:我们对这种想法的分析应该是:①创建动物这个模板,②给这个模板添加属性。
代码这么实现:
//创建动物结构体
struct Animal
{
//属性名
char name[10]; //名字
int weight; //体重
int age; //年龄
};
显然,我们这么创建的动物结构体,符合结构体的定义格式:struct 结构体名{属性名;};
二、结构体的变量
结构体的变量是什么?我们前面提到了,创建一种结构,我们是用struct来创建,格式是:struct 结构体名{属性名;};
但当我们创建完这个结构体后,我们就可以将结构体,也就是模板,也就是我们上面的Animal,我们就可以将Animal理解为是一种类似于int,short,char类型的关键字来使用。我们可以用Animal来定义变量,用Animal定义的变量同样也有内存。
但是,这里我们需要讲的是,Animal是一个模板,这个模板有自己的属性,用这样一个有属性的模板去创建的对象,那么所创建的对象也就具有相同的属性。
首先,我们来了解一下,结构体创建对象的几种方式:
二(一)在创建结构体的时候创建对象
格式:
struct 结构体名
{属性名;}变量名1,变量名2;
//创建动物结构体的同时创建结构体变量
struct Animal
{
//属性名
char name[10]; //名字
int weight; //体重
int age; //年龄
}Cat,Dog;//用Animal这个结构体创建了Cat,Dog这两个结构变量,这两个变量都拥有名字,体重,年龄这几个属性。
二(二)在创建完结构体后再创建对象
格式:结构名 结构变量名;
#include<iostream>
using namespace std;
//第一步,创建动物结构体
struct Animal
{
//属性名
char name[10]; //名字
int weight; //体重
int age; //年龄
};
int main()
{
//第二步,创建完结构体后再用结构名去创建变量
Animal Cat; //用Animal这个结构体创建了Cat变量,Cat拥有Animal的所有属性
Animal Dog; //用Animal这个结构体创建了Dog变量,Dog拥有Animal的所有属性
return 0;
}
二(三)了解完如何定义结构变量后,我们一起来看看如何利用变量去调用变量所拥有的属性。
格式:变量名.属性名
通过这个格式,我们可以对变量的属性进行相应的初始化
二(四)提到初始化,结构体变量初始化有两种方式:①直接初始化(在定义结构变量的时候进行初始化,初始化成员的顺序为结构体属性声明的顺序)②间接初始化。
直接初始化就如同下面一样:
结构体本身的属性声明顺序为: name[10];weight;age
那么,直接初始化时,赋值的顺序也就是名字,体重,年龄进行赋值,并输出验证,是否成功对变量的属性进行了初始化
代码如:
#include<iostream>
using namespace std;
//创建动物结构体
struct Animal
{
//属性名
char name[10]; //名字
int weight; //体重
int age; //年龄
};
int main()
{
Animal Cat = {"猫",10,1}; //在创建结构变量的时候进行初始化,初始化顺序为结构体属性的声明顺序
Animal Dog = {"狗",20,2}; //直接初始化,分别为名字,体重,年龄
cout <<"动物名字为:"<< Cat.name << endl;
cout << "动物体重为:" << Cat.weight << endl;
cout << "动物年龄为:" << Cat.age << endl;
cout << "动物名字为:" << Dog.name << endl;
cout << "动物体重为:" << Dog.weight << endl;
cout << "动物年龄为:" << Dog.age << endl;
return 0;
}
运行结果:
间接初始化就不是在定义的变量的时候进行初始化,而是通过结构变量来调用属性,从而对属性进行赋值。
#include<iostream>
using namespace std;
//创建动物结构体
struct Animal
{
//属性名
char name[10]; //名字
int weight; //体重
int age; //年龄
};
int main()
{
Animal Cat = {"猫"}; //当然,我们可以只对变量的属性部分初始化,赋值的顺序仍然是结构属性声明的顺序。所以猫赋值给了字符数组name[10]
Animal Dog = {"狗"}; //同理
//对结构变量的属性进行调用,并且对属性进行初始化---间接初始化
Cat.age = 2;
cout <<Cat.name<< "的年龄为:" << Cat.age << "岁" << endl;
Dog.weight = 30;
cout <<Dog.name<< "的体重为:" << Dog.weight << "千克" << endl;
return 0;
}
运行结果:
三、结构体成员
通过一二节,我们学会了如何去创建结构体,如果利用结构体去创建变量,以及如何使用变量去调用自己的相关属性。这里我们引入结构成员这样一个概念。
结构体成员:结构体成员就包含了成员属性和成员函数(也称为成员方法或结构体方法)
成员属性:成员属性就是我们上面所说的,结构体自己的属性,结构体定义变量后,变量也拥有这结构体的属性。从而能够对属性进行赋值,输出等操作。
成员函数:成员函数实际上就是结构体的功能,这个模板能够执行怎么样的功能,或者说这个模板创建的对象能够做什么,执行什么功能。这就是成员函数。
还是像上面一样,我们就Animal来举例,我们熟知,大部分的动物都会吃东西,都会跳,那么吃东西就可以作为结构体的功能,所以我们就可以认为的去给对应的结构体写这样一个函数。从而结构体所创建的变量也能够拥有结构体自带的功能,从而结构体变量就能够去调用对应的成员函数。
== 格式:结构体变量.函数名(形参表)==
例如:
代码如下:
#include<iostream>
using namespace std;
//创建动物结构体
struct Animal
{
//成员属性:
char name[10]; //名字
int weight; //体重
int age; //年龄
//成员方法:
void Eat()
{
cout<<name << "吃东西了" << endl;
}
void Jump()
{
cout <<name<< "跳跃了" << endl;
}
};
int main()
{
Animal Cat = {"猫"}; //当然,我们可以只对变量的属性部分初始化,赋值的顺序仍然是结构属性声明的顺序。所以猫赋值给了字符数组name[10]
Animal Dog = {"狗"}; //同理
//对结构变量的属性进行调用,并且对属性进行初始化---间接初始化
Cat.age = 2;
cout <<Cat.name<< "的年龄为:" << Cat.age << "岁" << endl;
Dog.weight = 30;
cout <<Dog.name<< "的体重为:" << Dog.weight << "千克" << endl;
//对结构体变量的函数进行调用,简称为:结构体变量执行了某功能。(或者调用了某函数)
Cat.Eat(); //猫调用了吃东西函数(或者猫调用了吃东西方法)
Cat.Jump(); //猫调用了跳跃函数(或者猫调用了跳跃方法)
Dog.Eat(); //狗调用了吃东西函数(或者狗调用了吃东西方法)
Dog.Jump(); //狗调用了跳跃函数(或者狗用了跳跃方法)
return 0;
}
运行结果:
关于C++的学习,欢迎大家关注我,对我的文章进行评论,点赞,收藏,关注我不迷路。也欢迎广大网友跟我探讨C++的干货。C++的知识,远远不止这么点,我们一 一进行分析讲解。网友有什么想让我来进行讲解的,可以评论留言,我也会尽我所能给大家去做好讲解。
公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!
.作者:ProMer_Wang
链接:https://blog.csdn.net/qq_43801020/article/details/107182468
本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!