有关默认初始化的问题

c++ primer,“内置类型的默认初始化”到底指什么?书中p40说和定义的位置有关,在函数体外 默认初始化到底指什么?书中p40说和定义的位置有关,在函数体外初始化为0,在函数体内则未定义,我试了一下,确实是这样;书p40之后提到默认初始化时就根本不管定义的位置,都是未定义,比如int *p = new int,此语句中*p的值未定义。

 

提问者采纳

能自动初始化的只是静态存储区的成员(全局成员,static声明成员都放在静态存储区),new出来的空间是操作系统自动分配的堆空间,所以不会自动初始化0

追问:

我问的是:什么叫默认初始化?(仅针对内置类型,不考虑类)

追答:

C++好像就没停过默认初始化这名字。有几种可能与初始化有关:
1)内置成员初始化
2)默认构造函数
3)构造函数成员初始化
4)默认参数函数
你说的是哪种?

追问:

这些具体的我都知道。就是搞不清到底啥是默认初始化。我把书里原话发给你。

追答:

发吧,c++ primer这书我也看过,你说下第几章。最后解释下上面那个问题:申请一个空间后到底会不会给他初始化,完全取决于这个空间在哪申请的,如果是在全局域申请的,那么会自动初始化为0,想你所说的int *p = new int;这句话什么意思?首先申请一个int大小的空间,并且让指针p指向他,那么这个int因为是new申请的,所以他是在堆申请,所以就不会初始化为0.存储空间申请分为三种:静态空间,堆空间,栈空间

追问:

p40之后用到默认初始化这个词时,总说:执行默认初始化时,内置类型的值是未定义的

顺便给我解释一下啥叫值初始化

追答:

执行默认初始化时,内置类型的值是未定义的.这句话是有前提的,前提是什么,前提就是这个内置类型在哪申请的空间。
int a;//,在静态存储区申请,所以初始化为0
int a_1=3;//这个叫做值得初始化,3作为初始值
int main()
{
int k=5;//这个叫做有初始化
k=8;//这个不是初始化,叫赋值
int b;//b也是内置类型,但是他在函数体申请,所以是在栈申请的空间,所以值未定义
int *p=new int;//new出来的空间都是在堆申请的,有操作系统自动分配可用空间,所以不会初始化
static c;//static申明的成员是存储在静态存储空间的,所以会初始化为0
return 0;
}

追问:

总的说,就是书写的有问题?

值初始化你还没解释,见p88,书中只针对vector讲了下值初始化,并没有普遍的定义值初始化。对内置类型值初始化,我的理解就是把对象初始化为二进制码为0的一个值,不知道对不对

追答:

我用现实的例子和你说吧,比如,你去买水,假如你在中山路买这瓶水,如果水上面有价格标签,那么按照这个价格付钱,这就是有初始化,假如这个水没标签,那么他就默认是3元,这叫默认初始化。但是这是在中山路的规则,如果你去北京路,同样的水,如果写了标签,按照标签支付,如果没写标签,则价格未知。这就是北京路的规则。同样的水(内置类型)在两个地方买(在不同的存储区申请)有不同的规则。

追问:

哦,知道了,书中所说的位置理解为你所说的三个位置,好像就没有矛盾了,我原来只盯着函数体外函数体内。

uninitialize包含于default initialize

追答:

不论你现在能不能看懂,如果以后能懂了,也可以回来看下,我给你做简单的分类:
1)内置类型:就是非用户创造的类型,如int char,用户定义类型就是类和结构。例如struct A
2)在静态存储区申请的内战类型(int,char),有两种,第一种,在main()函数外面的,第二种,在函数体里面的(包括main函数)用static 申请的,都是属于在静态存储区申请的空间
2)堆空间申请,由程序员主动申请和撤销,C的写法是mallocc++newC++也能用malloc,但是必须定义头文件stdlib
3)栈空间,就是函数体里面申请的变量,并且没有加static前缀,他在函数执行完同时空间被计算机收回。

追问:

虽然堆和栈不怎么了解,但你写的关于它们的定义我基本看得懂。辛苦你打这么多字啦,我会加分给你的!

要是书里也分这三个位置来讲,我大概就不会糊涂了,但书上根本不讲堆栈,这写的着实让我蛋疼

追答:

不是的,一开始讲这些会让读者失去信心的,因为这还涉及到同名变量的问题,不同文件同名变量的问题,函数体成员的生命期等问题,这些在学习名字空间时候会在提到的。学习的原则就是没学到的东西忽略它。

追问:

啊,堆栈还和namespace有关啊,好吧,这在书的很后面了,暑假估计学不到那了。虽然对书中的默认初始化还是有些困惑,但要是抛开书,看你的,倒是清楚了很多。真的谢谢你了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值