VC++中关于“动态创建对象”的疑惑 (50分)

  • 主题发起人 主题发起人 小唐
  • 开始时间 开始时间

小唐

Unregistered / Unconfirmed
GUEST, unregistred user!
我对“动态创建对象”不太懂,以下是我对Clone()这个成员函数的理解,
如有不对的地方,请批评指正。
Date *Date::Clone()
{
Date * pNew=new Date;
//这一句书上说叫“动态创建对象”,
//我对这个概念不懂,我的理解是
//就是在内存中申请一块空间并将指针pNew指向这个空间
//的首地址。
*pNew=*this;
  //这一句给上面申请到的空间赋值(对象),
//从而实现克隆对象的目的
return pNew;
//返回(申请到的已经被赋了值(对象)的内存空间的首地址)
}
如果我以上的理解是对的,那么下面这两条我就又不懂了:
Date *pDate=new Date
pDate->SetDate(1994,11,3);
//我的疑问:
//指针pDate已经指向了内存中的一块新的区域,
//那块区域还没有内容(不知是不是没有内容?)
              //,为什么可以用"->"呢?
=========================================================================
下面是网上的文章:
指向类的指针
  指针在类中的操作要格外小心,你可以用如下的办法定义一个类:
class MyClass
{
  public:
  int m_Number;
  char m_Character;
};
  接着你就可以定义一个MyClass 类的变量了:
MyClass thing;
  你应该已经知道怎样去定义一个指针了吧:
MyClass *thing;
  接着你可以分配个内存空间给它:
  (“接着你可以分配个内存空间给它”,这句话是什么意思呀???)
(下面这个语句不懂啊,我也可以说是指针指向了个动态创建的对象,可是,
   这个动态创建的对象MyClass又是什么呢,有人说这个MyClass只是一个申请
   到的内存空间而已,并没有内容,不知这种说法对不对?。还有,倒底是动
态创建的“对象”还是动态创建的“类”啊?我现在越来越糊涂了)
  thing = new MyClass;
  注意,问题出现了。你打算怎样使用这个指针呢,通常你可能会写'thing.m_Number',但是thing是类吗,不,它是一个指向类的指针,它本身并不包含一个叫m_Number的变量。所以我们必须用另一种方法:就是把'.'(点号)换成 -> ,来看下面的例子:
class MyClass
{
public:
int m_Number;
char m_Character;
};

void main()
{
MyClass *pPointer;
pPointer = new MyClass;

pPointer->m_Number = 10;
pPointer->m_Character = 's';

delete pPointer;
}
 
Date *pDate=new Date
就已经分配了空间。自然可以用“->”了。看一下C的书。
 
好吧我再看看书,同时看看还有没有其它高手回答
 
pDate是一个指针,当然用->了
如果是Date对象,就直接用.了
Date *pDate=new Date //已分配了空间,调用缺省构造函数初始化
pDate->SetDate(1994,11,3);
//调用类的成员函数
 
Date *pDate=new Date //已分配了空间,调用缺省构造函数初始化
/////////可是pDate指向的那个空间还是空的呀,怎么能用->符号执行下面这语句呢?
pDate->SetDate(1994,11,3);
//调用类的成员函数
 
/////可是pDate指向的那个空间还是空的呀,怎么能用->符号执行下面这语句呢?
怎么就不能用->符号执行下面这语句呢????
As an example
vector<int> *ivec;
//ivec内容为空
ivec->push_back(3);
//向ivec添加数据3
这里不是一样的道理么
 
不是这样的。在编译程序构造对象的时候,把只为内部的存储变量分配空间,而对于方法而言,相同的类中相同的方法的地址空间是一样的(虚方法不是这样的)。这也就是在C++中,为什么有拷贝构造函数的原因了。它的拷贝构造函数只是为内部的资源进行拷贝,而不用对方法地址做任何操作。
这些东西对不同编译器而言,它内部的构造对象的方法是不同的。但是标准C++是这样构造的,无论是在栈或是堆是分配。
 
后退
顶部