关于struct的问题

hurricane313 2017-08-17 04:45:15
struct有构造函数吗?今天发现定义的非struct成员变量如果不初始化为随机值,但是struct的成员变量也为初始化,但是全部为0,这是什么原因,望解答,谢谢
...全文
334 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hurricane313 2017-08-18
  • 打赏
  • 举报
回复
引用 10楼自信男孩 的回复:
引用 7 楼 hurricane313 的回复:
[quote=引用 6楼自信男孩 的回复:]结构体定义的变量是多种基本变量的一个集合。定义的变量和基本类型定义的变量一样。对于定义的局部结构体变量,若不初始化,结构体成员都为随机值,但是定义的全局或静态结构体变量,编译器会将其成员初始化为0.
经过多次试验,结构体局部变量也被初始化为0
贴出你的代码看看; 我试过的是都是随机值[/quote]代码没问题,估计是编译器起了作用
hurricane313 2017-08-18
  • 打赏
  • 举报
回复
引用 8楼ID870177103 的回复:
struct和class的区别只有默认可见性,struct也可以继承和多态! 如果你不定义的话,c++的默认构造函数就是调用每个成员,和父类的构造函数 但是如果是基本类型,是没有默认构造函数的,或者说默认构造函数只是语法糖 每个成员,父类都是基本类型或者平凡类型的struct,如果构造函数是默认的,那它也是平凡类型 还有一些可见性之类的限制,具体可以百度 如果用{0},(),{}初始化平凡的类型的实例,编译器会将该内存都填充为0(但是不同编译器有点不同) 否则的话平凡类型的内容就是默认栈祯,默认栈祯的填充值在debug和release,自定义的编译选项中是不同的 可以使用std::is_pod判断类型是否平凡类型
谢谢。
自信男孩 2017-08-18
  • 打赏
  • 举报
回复
引用 7 楼 hurricane313 的回复:
引用 6楼自信男孩 的回复:
结构体定义的变量是多种基本变量的一个集合。定义的变量和基本类型定义的变量一样。对于定义的局部结构体变量,若不初始化,结构体成员都为随机值,但是定义的全局或静态结构体变量,编译器会将其成员初始化为0.
经过多次试验,结构体局部变量也被初始化为0
贴出你的代码看看; 我试过的是都是随机值
倚栏|听风 2017-08-18
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分! 学习一下!!
ID870177103 2017-08-18
  • 打赏
  • 举报
回复
struct和class的区别只有默认可见性,struct也可以继承和多态! 如果你不定义的话,c++的默认构造函数就是调用每个成员,和父类的构造函数 但是如果是基本类型,是没有默认构造函数的,或者说默认构造函数只是语法糖 每个成员,父类都是基本类型或者平凡类型的struct,如果构造函数是默认的,那它也是平凡类型 还有一些可见性之类的限制,具体可以百度 如果用{0},(),{}初始化平凡的类型的实例,编译器会将该内存都填充为0(但是不同编译器有点不同) 否则的话平凡类型的内容就是默认栈祯,默认栈祯的填充值在debug和release,自定义的编译选项中是不同的 可以使用std::is_pod判断类型是否平凡类型
hurricane313 2017-08-18
  • 打赏
  • 举报
回复
引用 6楼自信男孩 的回复:
结构体定义的变量是多种基本变量的一个集合。定义的变量和基本类型定义的变量一样。对于定义的局部结构体变量,若不初始化,结构体成员都为随机值,但是定义的全局或静态结构体变量,编译器会将其成员初始化为0.
经过多次试验,结构体局部变量也被初始化为0
自信男孩 2017-08-17
  • 打赏
  • 举报
回复
结构体定义的变量是多种基本变量的一个集合。定义的变量和基本类型定义的变量一样。对于定义的局部结构体变量,若不初始化,结构体成员都为随机值,但是定义的全局或静态结构体变量,编译器会将其成员初始化为0.
hurricane313 2017-08-17
  • 打赏
  • 举报
回复
引用 1楼赵4老师 的回复:
不同编译器,不同输出版本(Debug/Release),会有不同值。
那是不是意味着,只要第一次运行默认值是0,不换版本,不重新编译,以后每次运行默认值都是0
hurricane313 2017-08-17
  • 打赏
  • 举报
回复
引用 2楼做或不做 的回复:
首先要分清楚你是在C++ 编译器 还是C编译器? 我猜你应该是问在C++中的编译器吧 如果是在C++的编译器中 struct与class是小异大同。struct默认访问权限是public,class是private;class有继承,多态机制,而struct没有。 关于你问的定义的 非struct成员变量如果不初始化为随机值 struct的成员变量也为初始化为0 C++分为四部分 (1)C 部分 (2)面向对象部分 (3)C++模板 (4)STL 其中关于C部分中的 如int char等基本类型的 初始化值是未定义的 而关于C++中实现的 如string 类型 确是 初始化值是0 因为它的默认构造函数会帮助它初始化为0 class A { public: A(){}; private; int a; string t; } 所以C++提供了一个构造函数的成员初始化列表 来对如string 类型进行初始化,防止进行多余的拷贝构造。 所以你经常看到成员初始化中把C的基本类型 写在成员初始化列表 目的是代码风格一致性。 如果关于是C部分的基本类型 初始化的值是随机的。 通常是0.但是你不能期待上帝 每次都会是0.
你的意思是,struct的int成员如果未初始化,那么他的值为0是偶然的,不是必然的。
hurricane313 2017-08-17
  • 打赏
  • 举报
回复
引用 2楼做或不做 的回复:
首先要分清楚你是在C++ 编译器 还是C编译器? 我猜你应该是问在C++中的编译器吧 如果是在C++的编译器中 struct与class是小异大同。struct默认访问权限是public,class是private;class有继承,多态机制,而struct没有。 关于你问的定义的 非struct成员变量如果不初始化为随机值 struct的成员变量也为初始化为0 C++分为四部分 (1)C 部分 (2)面向对象部分 (3)C++模板 (4)STL 其中关于C部分中的 如int char等基本类型的 初始化值是未定义的 而关于C++中实现的 如string 类型 确是 初始化值是0 因为它的默认构造函数会帮助它初始化为0 class A { public: A(){}; private; int a; string t; } 所以C++提供了一个构造函数的成员初始化列表 来对如string 类型进行初始化,防止进行多余的拷贝构造。 所以你经常看到成员初始化中把C的基本类型 写在成员初始化列表 目的是代码风格一致性。 如果关于是C部分的基本类型 初始化的值是随机的。 通常是0.但是你不能期待上帝 每次都会是0.
我真的没看懂,能直接回答我的问题吗?
做或不做 2017-08-17
  • 打赏
  • 举报
回复
首先要分清楚你是在C++ 编译器 还是C编译器? 我猜你应该是问在C++中的编译器吧 如果是在C++的编译器中 struct与class是小异大同。struct默认访问权限是public,class是private;class有继承,多态机制,而struct没有。 关于你问的定义的 非struct成员变量如果不初始化为随机值 struct的成员变量也为初始化为0 C++分为四部分 (1)C 部分 (2)面向对象部分 (3)C++模板 (4)STL 其中关于C部分中的 如int char等基本类型的 初始化值是未定义的 而关于C++中实现的 如string 类型 确是 初始化值是0 因为它的默认构造函数会帮助它初始化为0 class A { public: A(){}; private; int a; string t; } 所以C++提供了一个构造函数的成员初始化列表 来对如string 类型进行初始化,防止进行多余的拷贝构造。 所以你经常看到成员初始化中把C的基本类型 写在成员初始化列表 目的是代码风格一致性。 如果关于是C部分的基本类型 初始化的值是随机的。 通常是0.但是你不能期待上帝 每次都会是0.
赵4老师 2017-08-17
  • 打赏
  • 举报
回复
不同编译器,不同输出版本(Debug/Release),会有不同值。

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧