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

  • 结构体概念
  • 定义结构体
    • 定义结构体及结构体变量
    • 结构体变量的特点
    • 成员调用
    • 成员函数调用
  • 结构体的构造函数
  • 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

[C++]试一试结构体struct node的构造函数相关推荐

  1. C语言的几种结构体Struct的赋值方法

    C语言的几种结构体Struct的赋值方法 1. 定义结构体类型 这里是两个结构体的基本结构. struct Init{int a;float b;double c; }I1; struct SIMPL ...

  2. linux 结构体 struct addrinfo 简介

    目录 定义 相关方法 1. getaddrinfo(const char, const char, const struct addrinfo, struct addrinfo*) 2. freead ...

  3. 结构体struct timeval 和 struct timespec的定义

    结构体struct timeval 和 struct timespec的定义均在头文件<sys/time.h>中,具体定义如下: struct timeval {long tv_sec; ...

  4. Golang结构体struct的使用(结构体嵌套, 匿名结构体等)

    转自: https://studygolang.com/articles/11313 golang中是没有class的,但是有一个结构体struct,有点类似,他没有像java,c++中继承的概念,但 ...

  5. linux sock结构体,struct socket结构体详解

    在内核中为什么要有struct socket结构体呢? struct socket结构体的作用是什么? 下面这个图,我觉得可以回答以上两个问题.  由这个图可知,内核中的进程可以通过使用struct ...

  6. 内核中用于数据接收的结构体struct msghdr

    我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...

  7. C/C++结构体struct 与结构体数组和枚举型enum的结合使用

    C/C++结构体struct 与结构体数组和枚举型enum的结合使用 #include "stdafx.h" #include <string> #include &l ...

  8. 14.结构体struct.rs

    //Rust 里 struct 语句仅用来定义,不能声明实例,结尾不需要 ; 符号,而且每个字段定义之后用 , 分隔#[derive(Debug)] struct Site {domain: Stri ...

  9. 内核中用于数据接收的结构体struct msghdr以及iovec介绍

    我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,ping另一台主机172.16.48.1.我们使用系统调用send ...

最新文章

  1. 如何通俗易懂的理解贝叶斯网络及其应用
  2. 爬虫python下载-python 下载 爬虫
  3. Eclipse配置Android开发环境
  4. 修复 SyntaxHighlighter 3.0.83 Java 代码多行注释 Bug
  5. Qt connect信号连接的几种写法
  6. VTK:隐式球体用法实战
  7. 一名新晋程序员的自述:我的编程自学之路
  8. QT之QHash简介
  9. 工厂模式 java场景_研磨设计模式之简单工厂模式(场景问题)
  10. 今天买到了回家的火车票,有座儿,心情不错.
  11. MapGuide应用最佳实践—MapGuide Server和MapGuide WebExtension分开部署
  12. 如何在Word中绘制流程图
  13. SAP-ABAP-OOALV方法实现程序源码,仅供参考
  14. 浅析轻量化网络mobilenet
  15. 使用ROS驱动激光雷达YDLIDAR-G4的详细过程总结(教你避开使用的各种坑....)
  16. UART串口通信协议
  17. 分享一个技术知识类电子书网站
  18. mesos mysql_Mesos架构
  19. 40句让你坦露心声的经典句子
  20. 淘宝/天猫获得店铺的所有商品API接口

热门文章

  1. 《SAS编程与数据挖掘商业案例》学习笔记之二
  2. 生产者消费者_【线程通信】生产者消费者模型
  3. sql 触发器_一键生成某个sql的html--记录执行计划、统计信息、触发器等
  4. c语言二维数组代码,C语言之二维数组(示例代码)
  5. ant 改变表格数据_表格技巧—Excel表格怎么替换数字
  6. mysql 碎片率_MySQL数据碎片的整理和分析
  7. python3.7安装keras教程_Python3.7安装keras和TensorFlow的教程图解
  8. 用python画树_Python+Turtle动态绘制一棵树实例分享
  9. usb接口定义引脚说明_PerfDogService使用说明
  10. win10新建管理员账户_【经验篇001】Win10专业版如何开启超级管理员账户