C++结构体详解(一)_ProMer_Wang的博客-程序员宅基地

技术标签: C++的相关知识点  

最近有网友私信我,让我出一期关于结构体的博文,对结构体的基本结构进行讲解,但是由于结构体本身跟指针、跟数组都能搭上关系,所以博主准备出三期结构体的博文,对结构体的讲解进行分别的讲解。
话不多说,我们开始对结构体进行学习吧。前提:在学任何的新的知识的时候,首先对概念进行理解,只有对概念有正确和充分的理解,才能够正确的去使用对应的工具(关键字)

一、结构体的定义

结构体实际就是一种结构,其中成员列表由若干个成员组成,每个成员都是该结构的一个组成部分。
结构体的定义格式: 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++的知识,远远不止这么点,我们一 一进行分析讲解。网友有什么想让我来进行讲解的,可以评论留言,我也会尽我所能给大家去做好讲解。

作者:ProMer_Wang

链接:https://blog.csdn.net/qq_43801020/article/details/107182468

本文为ProMer_Wang的原创文章,著作权归作者所有,转载请注明原文出处,欢迎转载!

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

智能推荐

从零开始学习Windows WDF驱动程序开发_njOwenyang的专栏-程序员宅基地

摘要:本文通过简单的例子和精简的说明,带你快速了解和掌握基于WDF架构的Windows驱动程序的开发过程。WDF自带的文档非常详细而且冗长,读者需要一定的编程基础和英语水平,再加上一定的努力,才能看明白。而在网络上,写得既简单又清楚还具有操作性的资料几乎没有。本文就是一篇简洁明了并且有实际操作的教程,节约你宝贵的时间和脑细胞。即便你是从来没有接触过Window下面驱动程序开发的新手,也能让你快速建

oracle 服务中启动命令是什么,oracle服务启动命令_冯丹彤的博客-程序员宅基地

Oracle利用服务启动数据库与利用命令启动数据库的差异查看版本信息:SQL&gt; select * from v$version;一、独立启动:检查监听器状态:E:"&gt;lsnrctl statusLSNRCTL for 32-bit Windows: Version 9.2.0.1.0 - Production on 28-6月-2005 11:01:01Copyright (c) 19...

未来计算机的特点是什么,【简答题】未来计算机的发展将会呈现以下几个趋势:..._A001(10001)的博客-程序员宅基地

【简答题】未来计算机的发展将会呈现以下几个趋势:更多相关问题热阻在这种情况下,他觉得无法接受这份有价值的工作企业的名称通常不包括以下( )要素。关于产品形象表述正确的是______含硝基的的物质产生的什么化学物质会使儿童肺部发育受损?【论述题】试论台湾与大陆和平统一的必要性。【单选题】要输键盘按键上的上档字符,可以使用A. Enter 键 B. Shift 键 C. Numlock 键 D. Ct...

ORA-01507: database not mounted_weixin_33749131的博客-程序员宅基地

今天启动数据库时报错了!SQL&gt; startup mountORACLE instance started.Total System Global Area608174080 bytesFixed Size1220844 bytesVariable Size176164628 bytes...

XigmaNas系统(六):VirtualBox安装xp,迅雷,百度云安装,文件共享,远程桌面_liuyuncc的博客-程序员宅基地_xigmanas

XigmaNas系统(六):VirtualBox安装xp,迅雷,百度云安装,文件共享,远程桌面前面的操作并没有太大的占用内存,当启用VirtualBox时,内存占用为5%-8%。还可以启用VirtualBox点击web管理界面的url,进入VirtualBox。默认用户和密码都为admin。新建XP虚拟机安装镜像,设置vncvnc端口为9000开机,用vnc连接,安装xp系...

运算放大器使用的一些经验_江东风又起-程序员宅基地_运算放大器的应用心得

明人不说暗话,抄来的文章:http://www.elecfans.com/analog/20161128452967.html以下是正文:运算放大器,对于学工科的学生来说是一个耳熟能详的词。运算放大器作为最通用的模拟器件,广泛运用于信号变换调理、ADC采样前端和电源电路等场合。大家在学习模电课程的时候,都已经学会了运放的设计。然而在使用运放的时候,又有哪些需要注意的呢?1、注意输入电压是否...

随便推点

android 遇到的问题_Lei_Da_Gou的博客-程序员宅基地

1.图片加载失败什么的2.R文件找不到了。原因:删除图片的时候,我选择delete andway,说明有地方在使用该图片。然后我就将报错的主程序注释。然后clean project然后就解决了。报错的时候,错误信息在Gradle Console下面会说明。我的是img1.png引用错误,没这个文件。...

计算机教资科目三书籍,【教资笔试科目三】数学学科复习指导_李牧錞的博客-程序员宅基地

原标题:【教资笔试科目三】数学学科复习指导一、试卷结构汇总分析 分析完试卷结构,看看高频考点一般都怎么考?每一个高频考点下面,小编都放了一道真题及答案精析用学们在复习期间,要多做做分析真题,真题是非常有价值的。二、高频考点1数学的基本特点一、抽象性数学的抽象性表现在对空间形式和数量关系这一特性的抽象。它在抽象过程中抛开较多的事物的具体的特性,因而具有十分抽象的形式。它表现为较高的概括性,并...

Mtk6573平台调LCM亮度_佛系程序员-程序员宅基地

MTK6573平台修改LCM的最高亮度,有几种方法修改。1.修改中检测,把上层的亮度值加转换,限制最大值。比如最大的亮度,上层写到sys 里是255,那我在中间层把这个值变为200,那驱动层收到的值就是200. 这样最大亮度就降低了。同理,可以把最小亮度给提高一些。 看下面代码 找到lights.c文件 tatic struct light_state_t g_notifica

单字符常量在C和C++中的区别_闪电侠的家园-程序员宅基地

  C语言中单字符常量的类型为int,而c++中类型为char。 sizeof(c)在C++中为sizeof(char),而在C语言中为sizeof(int)。”  C++       printf("%d",sizeof(c));  // 1****************************************************************

hibernate的Criteria Query(转)_一个执着的程序员-程序员宅基地

当查询数据时,人们往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criter

疯狂Python讲义第七章练习_guzl86-程序员宅基地

# -*- coding: utf-8 -*-'''Created on [email protected]: insisted_search'''from traceback import print_exc'''1. 提示用户输入一个 N , 表示用户接下来要输入 N 个宇符串,程序尝试将用户输入的每一个字符串 用 空格分割成两个整数,并结算这两个整数整除的结果 。要求 :...

推荐文章

热门文章

相关标签