[C++]试一试结构体struct node的构造函数

可直接点击跳转到构造函数处

  • 结构体概念
  • 定义结构体
    • 定义结构体及结构体变量
    • 结构体变量的特点
    • 成员调用
    • 成员函数调用
  • 结构体的构造函数
  • Upd1
  • Upd2
  • Upd3

结构体概念

在实际问题中,一组数据往往具有不同的数据类型。
例如:人口大普查时,需要记录每一个人的姓名,年龄,性别,身份证等
这些信息分别要用整型,字符型,字符串型来记录。
为了解决这种问题,C++语言给出了另一个构造数据类型——“结构体”,
它在数据存储方面相当于其他高级语言的记录,但它有这面向对象的优势
在这里插入图片描述

定义结构体

定义结构体及结构体变量

有两种形式:
1:

struct 结构体类型名  //struct是关键字
  成员表; //可以有多个成员
  成员函数; //可以有多个成员函数,也可以没有
}结构体变量表; //可以同时定义多个,用“,”隔开

举个栗子

struct node { //定义了一个名叫node的struct类型string name;int math, chinese;int total;
}a[150];//定义了a数组变量

2:

struct 结构体类型名{
  成员表;
  成员函数;
};
结构体名 结构体变量名

举个栗子:

struct node {string name;int math, chinese;int total;
};
node a[150];

在定义结构体时注意,结构体变量名和结构体名不能相同。在定义结构体时,系统对其不分配实际内存,只有在定义结构体变量时,系统才为其分配内存

结构体变量的特点

(1)结构体变量可以整体操作,例如:

swap ( a[i], a[i + 1] );  //两个结构体变量里面的所有变量都进行交换

(2)结构体变量的成员访问也很方便清晰

cin >> a[i].name;

(3)结构体变量的初始化和数组的初始化类似

node opt = { "xiaoming", 12, 34, 1243 }; 

成员调用

结构体变量和各个成员之间的引用的一般形式为:

结构体变量.成员名

我们还可以这样操作

cin >> a[i].name  //一般情况下不能写成cin>>a[i]; 
a[i].total = a[i].math + a[i].chinese;

实际上结构体成员的操作与该成员类型所具有的操作是一致的
成员运算符“.”在存取成员数值时使用其优先级最高,并且具有左结合性
在处理结构体包含结构体的时候,可写作

strua.strub.memb

表示结构体变量strua有结构体成员strub;结构体变量strub有成员memb

成员函数调用

结构体成员函数调用的一般形式为:

结构体变量.成员函数

结构体成员函数默认将结构体变量作为应用参数


结构体的构造函数

这个才是我写这篇博客的原因
在这里插入图片描述

#include <iostream>
using namespace std;struct node {int p1, p2;
//这个就是构造函数了node ( int n1, int n2 ) { //可以随便取变量名,当然得是合法的p1 = n1;p2 = n2;}
};int main() {node a = node ( 2, 3 );printf ( "%d %d", a.p1, a.p2 );return 0;
}

运行结果如下,计算机自动从左到右依次匹配,把2匹配给n1,3匹配给n2
在这里插入图片描述
这种构造函数等同于以下多种的写法:
1.

#include <iostream>
using namespace std;struct node {int p1, p2;node ( int n1, int n2 ) :p1 ( n1 ), p2 ( n2 ) {}//构造了int类型的n1,n2,并将值赋值给了结构体里面的对应成员
};int main() {node a = node ( 2, 3 );printf ( "%d %d", a.p1, a.p2 );return 0;
}
#include <iostream>
using namespace std;struct node {int p1, p2;node ( int n1, int n2 ) {p1 = n1;p2 = n2;}
};int main() {node a ( 2, 3 );printf ( "%d %d", a.p1, a.p2 );return 0;
}

但是如果写成这样,计算机是无法识别的

	node a;a = node ( 2, 3 );

但是我又想让计算机识别该怎么办呢??
这个时候就需要在构造函数前面再加一句

struct node {int p1, p2;node(){}node( int n1, int n2 ) {p1 = n1, p2 = n2;}
};
node a = node( 2, 3 );

这个时候你就发现计算机正常运转了


在这里插入图片描述


当然构造函数里面可以多传几个,也可以选择不用传的参数,如:
在这里插入图片描述
在这里插入图片描述


在这里插入图片描述
但是有可能大家会看到一些大犇将构造函数写成这样子
在这里插入图片描述
可能会疑惑为什么构造函数里面的变量定义要给赋初值呢?
可以这么想:先提前申请多个变量,后面进行构造函数传参的时候,就算我们传得不够多,也能保证每个成员是有初值的,而不是随机乱码

也可以这么理解,如果我们没有给一些成员传参赋值,那么默认成员的值就被赋值成我们定义变量的初值,如图
在这里插入图片描述
注意,因为结构体是默认从左开始匹配,所以如果少传几个参数,前面的n1,n2肯定是有值的,换言之,计算机会自动先把前面的满足了,才往后推进


这也是为什么要赋初值的原因,如果我们不赋,后面的构造函数传参传少了,不管后面用没用到了那一个参数,就会被计算机报错,认为那是一个乱码很危险,如图
在这里插入图片描述
在这里插入图片描述


最后还是温馨提示,构造函数很难搞,经常容易出问题,所以大家可以采取最原始的赋值方式,尽管我喜欢构造函数

node a;
a.p1 = 2;
a.p2 = 4;
a.p3 = a.p1 * a.p2;

在这里插入图片描述


Upd1

时隔许久回来看这篇写的博客,只想由衷的感叹一句
构造函数一点都不难,只要不作死
现在基本上我的结构体构造函数已经固定写法了

struct node {int ...;node() {}node( int ... ) {}
};

如果你是一名竞赛生,不建议写各种炫技的骚操作,like this👇

struct node {int ...;node( int ... )...(), ...() {}
}

因为好像是不同的编译器标准有所出入,C++11C++11C++11下似乎可以识别,但是有些就会报错


建议以后写构造函数前
都加上一句

node(){}

这个语句,我自身理解为向计算机发送一种信号,告诉它我将以这种形式使用构造函数
不理解也没关系,反正多敲几个字符也少不了多少肉

加上这一句后,构造函数的两种使用
计算机都能识别成为同一个意思语句

struct node {int p1, p2;node(){}node( int n1, int n2 ) {p1 = n1, p2 = n2;}
};
node a = node( 2, 3 );
node a = { node } ( 2, 3 );

但如果不加,就只能使用原配

struct node {int p1, p2;node( int n1, int n2 ) {p1 = n1, p2 = n2;} 
}
node a = { node } ( 2, 3 );

老实说,如果不加这一句,后面的构造函数可有可无,计算机都能识别原配写法
即这么写,照样正常运行

struct node {int p1, p2; 
}
node a = { node } ( 2, 3 );

在这里插入图片描述
这里就多说一说这美丽的一行代码
其实它可以不为空
在这里插入图片描述

struct node {int n1, n2;int a[10];node() {p1 = 2;memset( a, 0, sizeof( a ) );}node( int n1, int n2 ) {p1 = n1, p2 = n2;}
}a;

这段里面的内容意思就是
一旦你申请了一个结构体aaa,计算机自动的就完成了a.p1=2a.p1=2a.p1=2的赋值以及结构体嵌套数组的清零操作,不用自己在里面手打一个clearclearclear函数就能起到同样的效果
经常在矩阵快速幂等各种场合的时候使用

Upd2

再提一句,构造函数的原配法则

上面的写法是

struct node {int a, b;
};
node x = { node } ( 2, 3 );

实际上,还可以更“原配”

struct node {int a, b;
};
node x = { 2, 3 };

对,没错,直接用大括号把赋的值包起来,连结构体名都不用写了

但是像这种计算机默认的写法,肯定是有自己铁一样的规矩的

——一定是按顺序依次赋值

也就是说,在结构体里面定义变量的顺序是,a,然后b

那么后面赋值的顺序,也一定是a=2,b=3

就不能像自己重载构造函数那么随意

struct node {int a, b;node(){}node( int A, int B ) { b = A, a = B; }
};
node x = node( 2, 3 );

这里更新主要是想说,原配也有传参数量不够的情况

struct node {int a, b, c, d;
};
node x = { 2, 3 };

这样还是a=2,b=3,但是c,d就不知道咯

Upd3

还有在初始化/初定义一个结构体的时候,连=都不要

node x( 2, 3 );

但这种写法必须建立在重载构造函数的基础上,计算机的原配是不会认识的

struct node {int a, b;node(){}node( int A, int B ) { a = A, b = B; }
};
node x( 2, 3 )

最后,现在官方都开c++14了,老实说,博主自己的构造函数都越写越简单了

私以为,没必要再像以前小心翼翼,但当然求稳肯定不是劣策

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)

文章目录T1&#xff1a;分数转换题目题解代码实现T2&#xff1a;Slow Path Finding Algorithm题目题解代码实现T3&#xff1a;切面包题目题解代码实现T1&#xff1a;分数转换 题目 Time limit: 1.5 seconds Memory limit: 512 megabytes 给定一个十进制小数&#xff0c;请你…

P3992 [BJOI2017]开车

P3992 [BJOI2017]开车 题意&#xff1a; 题解&#xff1a; 我们要先将问题转换 圈是车&#xff0c;x是加油站。红色部分为车移动的路线 数组a是车数量的前缀和 数组b是加油站的前缀和 而a[i]与b[i]的差的绝对值就是对应的红色路被走的次数 现在车发生位置移动&#xff0c;b数…

IdentityServer4-MVC+Hybrid实现Claims授权验证(四)

上节IdentityServer4-客户端的授权模式原理分析&#xff08;三&#xff09;以对话形式&#xff0c;大概说了几种客户端授权模式的原理&#xff0c;这节重点介绍Hybrid模式在MVC下的使用。且为实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置打下…

漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…

[CSP-S Day1,Day2 游记]提高组考后总结及学习编程C++以来的心得体会

怀着沉重而感慨的心情写下了这篇blog考试中暴露的问题Day1Day2综上解决方法学习历程及以来的心得体会职业精神这篇博客我可能会写好几天&#xff0c;我jio得这篇博客对我的学习历程以及态度产生深刻影响考试中暴露的问题 首先先说这次提高组考试的每道题所遇到的各种问题吧 Da…

【.NET Core项目实战-统一认证平台】第十二章 授权篇-深入理解JWT生成及验证流程...

上篇文章介绍了基于Ids4密码授权模式&#xff0c;从使用场景、原理分析、自定义帐户体系集成完整的介绍了密码授权模式的内容&#xff0c;并最后给出了三个思考问题&#xff0c;本篇就针对第一个思考问题详细的讲解下Ids4是如何生成access_token的&#xff0c;如何验证access_t…

P5049 [NOIP2018 提高组] 旅行

P5049 [NOIP2018 提高组] 旅行 题意&#xff1a; 一棵树(可能是基环树)&#xff0c;从1出发&#xff0c;每到达一个新的点就记录下编号。求一种走法使得记录下来的编号字典序最小。 1≤n≤500000 mn−1 或 mn 题解&#xff1a; 如果不是基环树&#xff0c;那直接每次走字典…

[2019CSP-S Day1]提高组Day1题解(格雷码[模拟(k转二进制取反的做法带证明)] + 括号树[DP] + 树上的数(暴力+菊花图+单链))

Day1T1&#xff1a;格雷码题目题解代码实现T2&#xff1a;括号树题目题解代码实现T3&#xff1a;树上的数题目10pts暴力题解代码实现25pts菊花图题解代码实现25pts单链题解代码实现T1&#xff1a;格雷码 题目 通常&#xff0c;人们习惯将所有 n位二进制串按照字典序排列&…

使用PerfView监测.NET程序性能(四):折叠,过滤和时间范围选择

在上一篇文章使用PerfView监测.NET程序性能&#xff08;三&#xff09;&#xff1a;分组中&#xff0c;我们使用了Perfview的分组功能。分组功能旨在对某些函数按照某个格式进行分组&#xff0c;以减少视图中的各种无关函数的数量。但仅有分组还不够&#xff0c;有时我们想将一…

带旋treap概念及模板,带例题:普通平衡树

带旋Treap二叉查找树BST(Binary Search Tree)定义Treap定义模板合集&#xff08;均为O(logn)O(logn)O(logn)&#xff09;push_up模板旋转模板插入模板删除模板查找前驱模板查找后驱模板查找键值key模板查找节点的修正值rank模板PS&#xff1a;rd的比较问题例题&#xff1a;普通…

微服务系列实践 .NET CORE

从事这个行业转眼已经6年了&#xff0c;从当初刚毕业的在北京朝八晚十&#xff0c;从二环到五环&#xff0c;仍每天精力充沛的小愤青&#xff1b;再到深圳一点一滴的辛勤在软件行业的耕种&#xff0c;从当初单体应用架构到现在微服务架构的经历&#xff0c;回想起来自己的收获倒…

P2607 [ZJOI2008]骑士

P2607 [ZJOI2008]骑士 题意&#xff1a; n个点n个边&#xff0c;每个点都有权值&#xff0c;相邻的点不能同时选择&#xff0c;问如何选择能使得权值最大 题解&#xff1a; 这个题很有P1352 没有上司的舞会这个题的感觉&#xff0c;唯一的区别是那个题保证是树&#xff0c;…

模板:线段树优化建图

前言 百川到海&#xff0c;天下归一 解析 线段树优化建图是用于对一个区间的点连边时的优化方法 建一棵in树一棵出树分别往上和下指即可 大概长这样 &#xff08;pia的洛谷的照片&#xff09; 建树 正常动态开点即可 void build(int &k,int l,int r){tr[ktot](tree){0…

[非旋平衡树]fhq_treap概念及模板,例题:普通平衡树,文艺线段树

文章目录概念全套模板push_up模板split拆树模板(按权值拆)split拆树模板(按个数拆)merge合并模板&#xff08;地址版&#xff09;merge合并模板&#xff08;带返回根&#xff09;区间模板insert插入模板delete删除模板find_kth找第k大模板get_rank找排名模板pre找前驱模板suf找…

surging 微服务引擎 1.0 正式发布

surging 是一个分布式微服务引擎,提供高性能RPC远程服务调用&#xff0c;服务引擎支持http、TCP、WS、Mqtt协议,采用Zookeeper、Consul作为surging服务的注册中心&#xff0c;集成了哈希一致性&#xff0c;随机&#xff0c;轮询、压力最小优先作为负载均衡的算法&#xff0c;底…

YBTOJ:彩色圆环

文章目录前言题目描述InputOutputSample InputSample Output解析代码前言 尽信书&#xff0c;则不如无书 题目描述 Input 仅有一行&#xff0c;该行给出依次两个正整数N, M&#xff0c;分别表示宝石的个数和宝石在变化时可能变成的颜色种类数。 Output 应仅有一行&#xff0…

【2019CSP-J 普及组题解】数字游戏(number),公交换乘(transfer),纪念品(souvenir),加工领奖(work) CSP普及游记

文章目录T1&#xff1a;数字游戏题目CODET2&#xff1a;公交换乘题目CODET3&#xff1a;纪念品题目题解CODET4&#xff1a;加工领奖题目题解CODE关于普及组的想法&游记T1&#xff1a;数字游戏 题目 小 K 同学向小 P 同学发送了一个长度为 8 的 01 字符串来玩数字游戏&…

搭建基于Docker社区版的Kubernetes本地集群

Kubernetes的本地集群搭建是一件颇费苦心的活&#xff0c;网上有各种参考资源&#xff0c;由于版本和容器的不断发展&#xff0c;搭建的方式也是各不相同&#xff0c;这里基于Docker CE的18.09.0版本&#xff0c;在Mac OS、Win10下分别搭建了一次。一、Mac OS下搭建安装Docker …

Infinite Tree

Infinite Tree 题意&#xff1a; 题解&#xff1a; 参考博客 看了好一阵子才明白。。。emm。 我们先按照题意画出一部分树 我们先不考虑复杂度&#xff0c;这题应该怎么做&#xff1f; 题目给了每个点的权值w[i]&#xff0c;问一个点到所有的节点路径长度*点权之和最小是多少…

IdentityServer4-从数据库获取User登录并对Claims授权验证(五)

本节将在第四节基础上介绍如何实现IdentityServer4从数据库获取User进行验证&#xff0c;并对Claim进行权限设置。一、新建Web API资源服务&#xff0c;命名为ResourceAPI&#xff08;1&#xff09;新建API项目&#xff0c;用来进行user的身份验证服务。&#xff08;2&#xff…