struct的构造函数

article/2025/6/18 3:42:40

C++之struct构造函数

(2010-10-19 15:04:47)
转载
标签:

cpp

struct

构造函数

校园

分类: C/C_PlusPlus

     在网络协议、通信控制、嵌入式系统的C/C++编程中,我们经常要传送的不是简单的字节流(char型数组),而是多种数据组合起来的一个整体,其表现形式是一个结构体。

     下面看看一道关于C++中笔试题:

// FileName:test.cpp

1:  #include <stdio.h>

2:  struct test
3:  {
4:       test(int n){
5:           printf("test(%d)/n",n);
6:       }

7:       test(){
8:           printf("test()/n");
9:         }

10:      void Fun(){

11:          printf("Fun()/n");
12:      }
13:  };

14:  int main()
15:  {
16:      test a(1);
17:      a.Fun();
18:      test b();
19:      b.Fun();
20:      return 0;
21:   }

    找出这个程序错误的一行?

    答案很简单就是第19行,往下看就知道为什么啦!

    结构是一种用关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等,不过,结构是值类型。但是,C++的结构和类是有区别的:
1、结构的构造函数和类的构造函数不同。
   a.结构不能包含显式的无参数构造函数。结构成员讲自动初始化为它们的默认值。
   b.结构不能包含以下形式的初始值设定类:base(argument-list);
2、对于结构中的实例字段成员,不能在声明时赋值初始化。
3、声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new,如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4、结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。

    从编译角度来思考下:

摘自csdn: http://blog.csdn.net/fuadam/archive/2008/08/04/2766616.aspx

    最近才知道struct和class的静态构造函数的触发规则是不同的,不像class在第一次使用类的时候触发静态构造函数。如果只访问struct实例的字段是不会触发静态构造函数调用的。通过测试发现当访问静态字段,struct本身的函数(静态和实例)和带参数的构造函数就会引起静态构造函数的执行。而调用默认构造和未覆写的基类虚函数是不会的。为什么呢?
    让我们先来看看class和struct在调用构造函数时的区别。class使用newobj指令而struct使用initobj指令来构造对象。newobj在堆上申请一块内存并调用相应的构造函数进行初始化,然后将对象地址返回给计算栈。initobj则是从本地变量表中载入已经分配出来的struct实例然后初始化struct的各字段。这个初始化过程是CLR内部执行的,而不像class编译器会给class添加一个默认构造函数(这就是为什么struct不能给字段添加默认值的原因。但在类中如果给字段添加了默认值编译器就会自动在构造函数中添加字段赋值操作)。如果给struct中定义了一个有参数的构造函数,那么系统就不会使用initobj指令,而是直接用call指令调用带参数的构造函数。
    我们最常见最常用的调用函数的指令是call和callvirt。对于静态函数使用call指令,对于class使用callvirt指令(不论class中的函数是不是虚的)。只有子类调用父类的函数的时候(避免递归调用)以及构造函数中(由编译器添加保证父类字段被初始化)使用call指令。而对于struct我们发现只要调用的函数是struct本身定义的都是使用call指令。call和callvirt指令的差别在于,call会把调用的函数当作静态函数看待,而不会关心调用当前函数时实例指针(this)是否为空。这就是struct调用函数时为什么都是call因为struct实例是不可能被置为null的。实际上class在调用非虚函数时实际上也是使用call的只是多做了一步验证——this是否为空,让我们来验证一下。


http://chatgpt.dhexx.cn/article/lVDKT1sO.shtml

相关文章

C++ | (struct)结构体变量作为函数参数调用的方法小结

结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 struct stud{long int num;float score;}; /*结构体变量作为函数的参数&#xff0c;修改之后的成员值不能返回到主调函数*/ void funvr(struct stud t){t.num2000101;t.score71.0;} /*结构体数组作为函数的参数…

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

可直接点击跳转到构造函数处 结构体概念定义结构体定义结构体及结构体变量结构体变量的特点成员调用成员函数调用 结构体的构造函数Upd1Upd2Upd3 结构体概念 在实际问题中&#xff0c;一组数据往往具有不同的数据类型。 例如&#xff1a;人口大普查时&#xff0c;需要记录每一…

struct构造函数 c++

(做到了一个题目&#xff0c;题目本身不重要&#xff0c;就是看到了大佬的代码&#xff0c;用了struct的神奇语法&#xff0c;这样一来代码十分简洁&#xff0c;看着舒服。) //待我学会了再来ಠ_ರೃ2021.2.7日晚 啊我好像会了QwQ 在struct内部写构造函数&#xff0c;实现str…

c++中struct构造函数

构造函数&#xff0c;说白了&#xff0c;就是初始化。 具体的打法是这个样子的&#xff1a; struct node{//构造函数node()//形参表{//内容} };例子&#xff1a; struct node{node(int c){xc;yz0;}int x,y,z; };当然&#xff0c;他既然作为一个函数&#xff0c;那么在里面自然…

MATLAB struct函数(结构体数组)

文章目录 语法说明输入参数示例例1: 在结构体中存储相关数据变量例2: 具有一个字段的结构体例3: 具有多个字段的结构体例4: 带有空字段的结构体例5: 包含元胞数组的字段例6: 空结构体例7: 嵌套结构体 语法 s struct s struct(field,value) s struct(field1,value1,...,fiel…

等价无穷小的替换条件

等价无穷小的替换条件&#xff1a; 拓展&#xff1a; 常用等价无穷小&#xff1a;x趋于0时&#xff0c;x和sinx是等价无穷小&#xff1b;sinx和tanx是等价无穷小&#xff1b;tanx和ln(1x)是等价无穷小&#xff1b;ln&#xff08;1x&#xff09;和ex-1是等价无穷小&#xff1b;…

常见的几个等价无穷小

当时有&#xff1a; 1、sinx~x 2、tanx~x 3、arcsinx~x 4、arctanx~x 5、ln(1x)~x 6、~x 7、~ 8、~ax 9、~xlna 补充&#xff1a; 1、等价无穷小的定理&#xff1a;两个无穷小之比的极限为1&#xff1b; 2、等价代换适用于因子&#xff0c;不适用于代数式中的和差&…

等价无穷小替换及其习题 笔记

等价无穷小替换https://www.bilibili.com/video/BV1eU4y1F7W4/?spm_id_from333.788.recommend_more_video.1 幂函数等价无穷小替换尤为重要 下列基本公式及其定理&#xff1a; 在求极限x趋于0&#xff0c;洛必达前先看有没有等价无穷小替换的机会 推广形式&#xff1a; 注意…

高数常用等价无穷小

高数常用等价无穷小公式 图源网络常用公式泰勒公式快乐&#xff01; 图源网络 我强调一下&#xff0c;图片来自网络&#xff0c;我只负责用ps加工一下&#xff0c;得到没用重复的公式然后做成自己的工具&#xff0c;没有其他意思 常用公式 泰勒公式 快乐&#xff01;

微积分 | 常用等价无穷小的整理 | 清晰

当 x → 0 x\to 0 x→0 时 sin ⁡ x ∼ x tan ⁡ x ∼ x ln ⁡ ( 1 x ) ∼ x e x − 1 ∼ x arcsin ⁡ x ∼ x arctan ⁡ x ∼ x log ⁡ a ( 1 x ) ∼ x ln ⁡ x a x − 1 ∼ ln ⁡ a ⋅ x 1 − cos ⁡ x ∼ 1 2 x 2 ( 1 x ) n − 1 ∼ x n \begin{aligned} &\sin x\si…

math_证明常用等价无穷小泰勒展开案例代换

文章目录 等价无穷小和泰勒公式常用等价无穷小泰勒公式&等价无穷小求解极限 无穷小量无穷小量的比较无穷小的阶(相对阶)利用等价无穷小来计算极限(代换原则)等价无穷小充要条件 常用的等价无穷小和推导 sin ⁡ ( x ) ∼ x \sin(x)\sim x sin(x)∼x t a n ( x ) ∼ x tan(x)…

vue-router 路由的懒加载原理及方式

当打包构建应用时&#xff0c;JavaScript 包会变得非常大&#xff0c;影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块&#xff0c;然后当路由被访问的时候才加载对应组件&#xff0c;这样就更加高效了。 结合 Vue 的异步组件和 Webpack 的代码分割功能&#…

JPA/hibernate懒加载原理分析及JSON格式API反序列化时连环触发懒加载问题的解决

什么是懒加载 JPA是java持久层的API&#xff0c;也就是java官方提供的一个ORM框架&#xff0c;Spring data jpa是spring基于hibernate开发的一个JPA框架。Spring data jpa提供了大量的数据库操作接口&#xff0c;以及采用动态代理的方式做的以接口方法命名的数据库操作方式&…

react性能优化-懒加载原理

编译阶段的优化 开发阶段构建更快 loader的include和exclude属性 {test: /.(j|t)sx?$/,use: [{loader: "thread-loader",},{loader: "babel-loader",options: {presets: [["babel/preset-env", { modules: false }], //es6->es5"babe…

js图片懒加载原理、实现及节流优化

1.懒加载原理 在图片没有进入可视区域时&#xff0c;先给的src一个默认加载的图片&#xff0c;这样浏览器就不会发送请求了&#xff0c;等到图片进入可视区域再把真实的图片路径data-src给src。 2.具体实现 1. 效果 2. 代码如下&#xff1a; <style>.imgList{width:…