C/C++变量初始化
C/C++这种比较原始的语言,没有垃圾回收,没有动态类型没有自动初始化特性,但往往编程中偷懒或者不小心会忘记初始化
比如在嵌入式开发中从来都不初始化好像也没太大问题
所以拿本地环境两种编译器看看什么情况有问题什么情况没问题 本帖最后由 JuncoJet 于 2024-12-16 15:41 编辑
所有的全局变量,包括static修饰的,都会自动初始化
所有的局部变量都不会自动初始化,包括成员变量
——Windows,VC++、gcc(MinGW)
Linux下有所不同,除局部变量外都能自动初始化 本帖最后由 JuncoJet 于 2024-12-16 16:06 编辑
成员变量手动初始化,有部分代码会导致初始化无效
必须使用构造函数或者static来初始化
哦,我的VC2005不支持这语法,编译出错了,新的C++是支持的,应该是没问题的 代码如下,欢迎自行编译测试
#include <stdio.h>
#include <conio.h>
int i;
float f;
class T{
public:
static int i;
float f;
};
int T::i=0;
int main(int argc, char *argv[]){
int li;
float lf;
static int si;
static float sf;
printf("%d %f\n",i,f);
printf("%d %f\n",li,lf);
printf("%d %f\n",si,sf);
T t;
T *tt=new T;
printf("%d %f\n",t.i,t.f);
printf("%d %f\n",tt->i,tt->f);
getch();
}
静态变量和全局变量都能初始化成默认值。
类(struct, class)成员能自动初始化成默认值,否则是编译器的BUG。
临时变量放栈上那就没办法了,只能是个垃圾值。 本帖最后由 JuncoJet 于 2024-12-16 16:19 编辑
chipset009 发表于 2024-12-16 16:07
静态变量和全局变量都能初始化成默认值。
类(struct, class)成员能自动初始化成默认值,否则是编译器的BUG ...
;P 好像Windows下都不会初始化
哦 想起来了加括号才能自动初始化,不加括号的不会
T *tt=new T(); C++博大精深 #include <cstdio>
#include <string>
struct A
{
int a;
float b;
};
struct B
{
A a;
char c;
std::string str;
};
int main()
{
B tb;// const B tb; will fail to build by g++ 13.3
printf("%d, %f, %c, %llu\n", tb.a.a, tb.a.b, tb.c, tb.str.size());
const B* pb = new (std::nothrow) B;
if(nullptr != pb)
{
printf("%d, %f, %c, %llu\n", pb->a.a, pb->a.b, pb->c, pb->str.size());
delete pb;
}
}
编译器偷懒了,B tb;由于放栈上,编译器(g++)对成员就当了临时变量处理的,不给初始化。如果加const会编译失败,提示没有初始化。如果放堆上,像const B* pb = new (std::nothrow) B;这种,就把成员给初始化成默认值。 JuncoJet 发表于 2024-12-16 16:12
好像Windows下都不会初始化
哦 想起来了加括号才能自动初始化,不加括号的不会
T *tt=new T();...
T的构造函数没给,为缺省值,缺省构造函数就是按照输入参数给每个成员赋值,如果你不给括号,new的时候相当于没有给构造函数参数,所以构造函数不会赋值,如果给了括号,相当于传给构造函数参数0,于是成员都赋值为0了 没有自动初始化特性,但往往编程中偷懒或者不小心会忘记初始化
++++++++++++++++++++++++++++++++++++++++
学校正经教出来的学生都会习惯性初始化,然后被其它编译器的 IDE 艹,你丫的画蛇添足干嘛 ;P
我觉得这才是C/C++精髓之处,给了程序员足够的自由发挥的空间,你凭啥认为默认值就不是垃圾值? 关于局部变量初始化这个话题,有个视频 UP 主叫 “码农高天” 的一期视频很不错,不仅讲了要不要初始化、而且讲了很多相关联的知识,油管子和 B 站都有,值得一看。
视频的标题是 “我与微软的代码规范之争——局部变量竟然不让初始化?” 局部变量需不需要初始化,我觉得还得看情况,不能一刀切。假如一个函数在程序中会被频繁调用,里面申请一块很大的内存,里面是什么值都不会影响程序运行结果,但编译器固定给你先写一轮0进去,结果性能有很大影响,这种情况还希望编译器默认初始化吗? 本帖最后由 JuncoJet 于 2024-12-17 09:35 编辑
spader 发表于 2024-12-17 09:06
局部变量需不需要初始化,我觉得还得看情况,不能一刀切。假如一个函数在程序中会被频繁调用,里面申请一块 ...
局部变量依赖栈的大小,不会给到很大的内存,初始化就一次性的操作
自动初始化不会消耗很大的时间
new malloc 的情况我觉得可以另当别论,使用memset初始化标准配置
但是吧既然标准配置了,何必不自动完成初始化
new不存在初始化问题 加括号就能自动完成初始化,所以上面列举特指malloc
malloc基本上搭配写入操作 read文件 recv网络数据,所以确实不初始化也能用,只要有写入大小 spader 发表于 2024-12-17 09:06
局部变量需不需要初始化,我觉得还得看情况,不能一刀切。假如一个函数在程序中会被频繁调用,里面申请一块 ...
初始化就是构造,有构造就得有析构,很大一笔开销,却毛用没有,编译器本来就知道类型,没有必要去做无用功。
于是后来的C++标准里逐渐添加规定了一堆奇葩类型,pod, trivial, standard_layout, scalar...
页:
[1]
2