C++构造函数问题?
在类中定义了一个构造函数,构造函数的作用主要是用来对数据成员初始化的吧~~当对象进入其作用域的时候,系统会为其分配存储空间吧~~在没有定义构造函数的时候,在创建对象的时候...
在类中定义了一个构造函数,构造函数的作用主要是用来对数据成员初始化的吧~~当对象进入其作用域的时候,系统会为其分配存储空间吧~~在没有定义构造函数的时候,在创建对象的时候会自动生存一个构造函数吧~~我就是问一下,对象数据成员的存储空间是当对象进入作用域的时候操作系统分配的,那存储空间是构造函数向操作系统申请的吗?还是分配存储空间与构造函数无关,而是在创建对象的时候系统自动分配···没有定义构造函数的时候那个空的默认构造函数什么都不做吗?
望大虾 详细的给解释一下,在这个地方有点想不通~~ 展开
望大虾 详细的给解释一下,在这个地方有点想不通~~ 展开
1个回答
展开全部
我不知道你是不是初学程序,你实际问到了一些比较深的问题,这里我只取一些简单的解释。
1.分配的时间
你定义了一个对象的时候就已经分配了(如果是指针我这里认为已经new了)
2.谁在分配?
和构造函数无关,构造函数所做的操作主要是对数据的初始化。申明一个新对象,简单讲经过了两部操作,第一步分配空间(new),第二步初始化(调用构造函数),负责分配空间的是C++的运行库,在WINDOWS下最终是调用virtualalloc(你如果想查这个函数可以去查,这个用于虚拟内存分配的).
但实际上用new定义一个对象有三部操作(例如string *p=new string())
1.分配空间
2.在分配的空间上调用构造函数
3.将空间地址返回给调用new的指针.
随便也就提一些东西,你可以看着玩玩,不要深入,下面的代码
class A
{
.....
}
void main()
{
A *p;
p=new A()
if(p!=null)
{
处理p中数据
}
}
上面的程序甚至是可能出错的,因为代码可能被“优化”,p=new A()可以分解为三步,由于CPU可以根据程序的情况进行乱序操作,所以有可能p先分配空间后并没有调用构造函数就直接返回了地址,这样导致p确实是不为NULL,进而导致后面出错(有相关的CPU指令可以禁止这样)。
举这个例子只是说明这个过程,更加深入的东西就不多提了。
1.分配的时间
你定义了一个对象的时候就已经分配了(如果是指针我这里认为已经new了)
2.谁在分配?
和构造函数无关,构造函数所做的操作主要是对数据的初始化。申明一个新对象,简单讲经过了两部操作,第一步分配空间(new),第二步初始化(调用构造函数),负责分配空间的是C++的运行库,在WINDOWS下最终是调用virtualalloc(你如果想查这个函数可以去查,这个用于虚拟内存分配的).
但实际上用new定义一个对象有三部操作(例如string *p=new string())
1.分配空间
2.在分配的空间上调用构造函数
3.将空间地址返回给调用new的指针.
随便也就提一些东西,你可以看着玩玩,不要深入,下面的代码
class A
{
.....
}
void main()
{
A *p;
p=new A()
if(p!=null)
{
处理p中数据
}
}
上面的程序甚至是可能出错的,因为代码可能被“优化”,p=new A()可以分解为三步,由于CPU可以根据程序的情况进行乱序操作,所以有可能p先分配空间后并没有调用构造函数就直接返回了地址,这样导致p确实是不为NULL,进而导致后面出错(有相关的CPU指令可以禁止这样)。
举这个例子只是说明这个过程,更加深入的东西就不多提了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询