注册 登录
编程论坛 C++教室

程序中的动态空间申请不是很理解,大家帮忙解释下了,万分感谢!

qshzh102 发布于 2010-11-03 10:18, 514 次点击
程序如下:
#include<iostream.h>
#include<string.h>
class student
{
    char num[10];
    char *name;
    int score;
public:
    student(char *nump,char *namep,int score)   //构造函数
    {
        if(nump)                                //在构造函数中,不需要动态申请num成员的空间
            strcpy(num,nump);
        else
            strcpy(num," ");
        if(namep)                               //在构造函数中,需动态申请name成员的空间
        {
            name=new char[strlen(namep)+1];
            strcpy(name,namep);
        }
        else name=0;
        score=score;
        cout<<"constructor called!\n";
    }
    ~student()                                 //在析构函数中,需释放name成员的空间
    {
        if(name) delete [] name;
        cout<<"destructor called!\n";
    }
    void show()
    {
        cout<<num<<'\t'<<name<<'\t'<<score<<endl;
    }
};
void main()
{
    student a("040120518","george",80);
    a.show();
}


其中,
if(nump)代表的什么意思啊?为什么不需要为num进行动态申请成员空间?
而在if(namep)中却要对name的成员进行动态空间的申请?

目前的理解:是不是因为num是一个字符数组在定义的时候已经对其进行了空间的分配,而name指针只用在使用的额时候才对其进行动态空间的分配,使用结束后立刻收回所分配的空间?

麻烦大家帮忙了
6 回复
#2
hahayezhe2010-11-03 10:56
if(nump)  判断nump == NULL
理解是对的
#3
qshzh1022010-11-03 11:07
NULL好像是空、没有有效的数据的意思吧
strcpy(num,nump);这条语句执行后num中好像还是空的没有存放数据吧?
应该不是这样子的啊
奇怪 期待各位的继续解答
#4
寒风中的细雨2010-11-03 12:15
this->score=score

#5
qshzh1022010-11-03 12:31
回复 4楼 寒风中的细雨
版主写了个this指针是啥意思啊?和NULL有关系还是说将score=score换成this指针?
#6
2010-11-03 14:13
if(num)
这里判断num指针指向的是否是空值   如果是空置的话

你的代码是strcpy(num," ");
把一个常量区的字符串的指针给num  内容只有一个空格和一个以0结尾   2个字节大


关于是否申请空间  这要看你成员变量是如何定义的    还有就是你的程序需求

如果能确定需要的数据最大空间   比如姓名  

其实你可以直接  char m_szName[32];     这样给32个字节来使用  

如果非要使用动态数组 那你就char *m_pszName;   使用的时候就得new 一个空间

在构造里如果new成员空间  那在析构里  必须

if(m_pszName)         //判断m_pszName是否为空     这里是为了防止重复释放   所以释放完 就把m_pszName赋值为NULL
{
   delete[] m_pszName;
   m_pszName = NULL;
}



注意 如果类里面的成员是指针的话    那你最好是把拷贝构造还有"="  都重载一下   否则容易发生重复释放问题
#7
qshzh1022010-11-03 14:45
回复 6楼 cacker
if(nump) 为判断nump是否为置空
那么下面的这一段代码:
student(char *nump,char *namep,int score)
{
    if(nump)
        strcpy(num,nump);
    else
        strcpy(num," ");
}
的意思是不是说:
如果nump为置空的话,将num=nump;如果nump不为置空的话,将会使num指向空格和'\0'了。
如果是那样的话,在main()中定义的对象:student a("040120518","george",80);作何解释啊?怎么将010120518赋给字符数组num了?
1