C++中对象的内存空间是在什么时候被分配的

C++中当创建一个对象时会自动调用它的构造函数,但是如果程序中有用到goto语句跳过或者对象是在swith中声明,在编译的时候就会报错,我想问下,在C++中这些程序开始声... C++中当创建一个对象时会自动调用它的构造函数,但是如果程序中有用到goto语句跳过或者对象是在swith中声明,在编译的时候就会报错,我想问下,在C++中这些程序开始声明的对象和程序中间声明的对象都是什么时候分配的空间(是在系统载入程序的时候就将程序中所有要用到的变量和对象一起分配么,还是走到定义处再分配),如果程序运行的时候跳过的定义处,在下面还能使用么? 展开
 我来答
百度网友060cf83d7
2010-01-09 · TA获得超过542个赞
知道答主
回答量:150
采纳率:0%
帮助的人:0
展开全部
你可能对C++中的结构体不是很了解。这些结构体有:enum(枚举),struct(结构),union(联合),class(类)。当你定义一个结构体类型时,是不存在内存分配的。譬如:
struct student
{
char *name;
int age;
};
这个时候仅仅是通知编译器有了student这种struct类型,没有内存分配。只有当声明一个对象时,即student s;时,编译器才会给变量s分配内存,且内存大小为student结构体大小,可以sizeof(s)求出为8。
另外,程序都是通过编译器编译成功后生成目标文件,才能执行的。编译器就是按顺序来给变量分配内存的,当然是走到变量声明处,才会给它分配内存。如果goto语句跳过变量声明,程序会报错,且看下面例子:
#include<iostream>
using namespace std;

int main()
{
goto b;
int i=10;
b:
cout<<i<<endl;

return 0;
}
很显然,编译器无法给i初始化,故编译出错。
另外,变量又分为全局变量和局部变量,又有static,auto等等之分。全局变量是在编译开始就分配内存,且放在静态存储区。局部变量则是走到该变量声明处才分配内存,且放在栈中,static也是指该变量放在静态存储区。如果想了解更多,请看网上高手写的日志:
http://pondra.blog.163.com/blog/static/491363082007111743634707/
以上拙见,希望能对你有所帮助。
疾似云流
2010-01-09 · TA获得超过1159个赞
知道小有建树答主
回答量:1093
采纳率:0%
帮助的人:486万
展开全部
你需要的是一本计算机组成结构的书籍。

switch中不加大括号是不能声明对象的;分配空间的时机决定于你的对象分配的方式,栈上、堆上、全局?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
myeset
2010-01-09 · TA获得超过593个赞
知道小有建树答主
回答量:493
采纳率:0%
帮助的人:298万
展开全部
那为什么这个程序是对的?

#include <iostream>
using namespace std;

int main( )
{
int i=0;
if ( i == 0)
{
int a = i;
cout << a << endl;
}
else
{
int b = i+1;
cout << b << endl;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
sos5403
2010-01-09 · TA获得超过462个赞
知道小有建树答主
回答量:351
采纳率:0%
帮助的人:290万
展开全部
C++允许在程序的内部申请变量,并不意味着可以在任何地方。具体的说,就是不允许在程序有分支的地方申请,比如if(a>b) int a;

至于类,如果学过C,就明白,其实只是有函数的结构体。他内部的变量空间,也是像普通变量一样申请的如上例中的int。

事实上,C++在这方面,只不过更人性化设计,对程序本身对多大的改变。只是不像c一样,一定要求在函数开始的地方将所有的变量都申请齐了。

至于楼主提问的,关于构造函数,实际上那申请的一般都是在堆内的空间。和我们刚才所说的,在栈内申请空间还是有本质区别的,希望楼主不要混淆~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式