| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 652 人关注过本帖
标题:求助:如何理解这样的类指针用法,谢谢。
只看楼主 加入收藏
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
求助:如何理解这样的类指针用法,谢谢。
  从百度下载了一个C++课程设计源程序,并通过了编译与运行,程序OK。
但读到程序中类指针用法时,一时找不到这样用法的出处,故难以理解,请大虾指点,谢谢,祝春节快乐!

程序进行了简化,问题在程序中标注的问号处,谢谢。

 #include <iostream.h>

#include <fstream.h>
#include <string.h>

//全局数据,对象
double CSalary; //文员的基本工资
double SSalary; //业务员的基本工资
double APSalary; //行政人员的基本工资
int ID; //员工工号(要保证唯一)

class Person //员工类
{

protected:
int No; //编号
char Name[20]; //姓名
char Sex[10];  //性别
char Tel[20];  //联系方式
char Nation[30];  //国籍
int Duty; //职位
double Earning; //收入
Person *next;
public:


Person(char ID,char *Name,int Duty)
{
this->Duty=Duty;
strcpy(this->Name,Name); // strcpy(string,ptr)   
this->No=ID;
}

friend class Company;
};
class Cservant:public Person //文员类
{
private:
double Workload; //上个月完成工作量
public:
Cservant(char ID,char *Name,int Duty,double Workload):Person(ID,Name,Duty)
{
this->Workload=Workload;
}

};
class Company //公司类
{
private:
Person *Worker; //员工表
void Clear(); //清除内存中数据
public:
Company()
{
Worker=0;
Load();
}
~Company(){
Person *p;
p=Worker;
while(p)
{
p=p->next;
delete Worker; // Person *Worker; //员工表

Worker=p;
}
Worker=0;
}

void Add(); //增加人员
 
};
void Company::Add()
{
Person *p; //新结点指针
int Duty;
char Name[20];
char Sex[10];  //性别
char Tel[20];  //联系方式
char Nation[30];  //国籍
double Workload;

cout<<"\n** 新增员工 **\n"; // \n换行

//输入员工信息
cout<<"输入工号:"; cin>>ID;
cout<<"输入职位(1-文员  2-行政人员兼职文员  3-文员兼职业务员  4-行政人员  5-业务员):"; cin>>Duty;
cout<<"输入姓名:"; cin>>Name;
cout<<"输入性别:"; cin>>Sex;
cout<<"输入联系方式:"; cin>>Tel;
cout<<"输入国籍:"; cin>>Nation;
if(Duty!=4)
{
cout<<"上个月完成工作量:"; cin>>Workload;
}

//创建新员工结点
switch(Duty)
{
case 1:p=new Cservant(ID,Name,Duty,Workload); break;
// ??????????????????????
// 没见过把一个成员函数直接赋给类指针的用法,故不知何意。
}
p->next=0;

}

[ 本帖最后由 bardon_2009 于 2012-1-18 09:53 编辑 ]
搜索更多相关主题的帖子: 业务员 class 百度下载 include double 
2012-01-17 22:39
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
收藏
得分:0 
进一步简化的程序:
 class Person //员工类
{
friend class Company;

}

class Cservant:public Person //文员类
{
public:
Cservant(char ID,char *Name,int Duty,double Workload):Person(ID,Name,Duty)
{
}
}
class Company //公司类
{
void Add(); //增加人员

}

void Company::Add()
{
Person *p
p=new Cservant(ID,Name,Duty,Workload); break;
//??????????????????????????????
//书上通常是把对象的地址赋给类指针。
//而不是直接将成员函数赋给类指针。

}  

[ 本帖最后由 bardon_2009 于 2012-1-18 09:57 编辑 ]
2012-01-18 09:37
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:20 
以下是引用bardon_2009在2012-1-18 09:37:59的发言:

 进一步简化的程序:
 class Person //员工类
{
friend class Company;

}

class Cservant:public Person //文员类
{
public:
Cservant(char ID,char *Name,int Duty,double Workload):Person(ID,Name,Duty)
{
}
}
class Company //公司类
{
void Add(); //增加人员

}

void Company::Add()
{
Person *p
p=new Cservant(ID,Name,Duty,Workload); break;
//??????????????????????????????
//书上通常是把对象的地址赋给类指针。
//而不是直接将成员函数赋给类指针。

}  
Person *p
p=new Cservant(ID,Name,Duty,Workload); break;
是这句话吗? 你可以查一下new的用法及new与malloc的区别, 基本意思是 new 操作符会返回一个对象的地址,故这么做是正常的而且是必须的。
Cservant(ID,Name,Duty,Workload) 是调用了一个类的构造函数,有四个参数的类的构造函数,类名是Cservant

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-01-18 16:48
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
收藏
得分:0 
以下是引用BianChengNan在2012-1-18 16:48:23的发言:

Person *p
p=new Cservant(ID,Name,Duty,Workload); break;
是这句话吗? 你可以查一下new的用法及new与malloc的区别, 基本意思是 new 操作符会返回一个对象的地址,故这么做是正常的而且是必须的。
Cservant(ID,Name,Duty,Workload) 是调用了一个类的构造函数,有四个参数的类的构造函数,类名是Cservant
谢谢,是这句。
就是在网上和书上,都难以找到这样类似的程序。
2012-01-18 20:42
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
收藏
得分:0 
在网上下载的教学课件上,发现了这样的调用构造函数法:
Date   *pdate = new Date(2010,4,28);
类名 *指针变量名=new  类名(实参表);

好象与
Person *p
p=new Cservant(ID,Name,Duty,Workload);
还是有点不同。
现不会自编程序来体会这种用法,故只能是有点了解,但还不能完全理解。
请大虾能给出实例说明就好,谢谢。
2012-01-19 15:53
BianChengNan
Rank: 8Rank: 8
等 级:贵宾
威 望:13
帖 子:302
专家分:972
注 册:2011-11-30
收藏
得分:0 
以下是引用bardon_2009在2012-1-19 15:53:04的发言:

 在网上下载的教学课件上,发现了这样的调用构造函数法:
Date   *pdate = new Date(2010,4,28);
类名 *指针变量名=new  类名(实参表);

好象与
Person *p
p=new Cservant(ID,Name,Duty,Workload);
还是有点不同。
现不会自编程序来体会这种用法,故只能是有点了解,但还不能完全理解。
请大虾能给出实例说明就好,谢谢。
你的Cservant类从Person继承而来,故这样是没有问题的。
new Cservant(ID,Name,Duty,Workload);会返回一个Cservant的指针,然后把这个指针转换成基类Person的指针。仅次而已。

顺便说一句,基类与子类在内存布局上有很大的联系,具体不是一句两句能说清的,请自己到网上查找资料。

我的群:149544757 C/C++/Assembly 喜欢交流的朋友进,进群请写消息
2012-01-19 18:59
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
收藏
得分:0 
以下是引用BianChengNan在2012-1-19 18:59:31的发言:

你的Cservant类从Person继承而来,故这样是没有问题的。
new Cservant(ID,Name,Duty,Workload);会返回一个Cservant的指针,然后把这个指针转换成基类Person的指针。仅次而已。

顺便说一句,基类与子类在内存布局上有很大的联系,具体不是一句两句能说清的,请自己到网上查找资料。
谢谢指点,在网上也看了new的用法及new与malloc的区别等内容,感觉还是要动手编程感受后才能理解透。
2012-01-19 20:37
CooperOne
Rank: 2
来 自:珠海
等 级:论坛游民
帖 子:40
专家分:48
注 册:2012-1-25
收藏
得分:0 
回复 5楼 bardon_2009
这两段是等价的也就是说
Person *p
p=new Cservant(ID,Name,Duty,Workload);
等价于
Person *p=new Cservant(ID,Name,Duty,Workload);

通俗地说就是定义了指针同时调用了构造函数

我是这么理解的

蹲得越低,跳得越高.
2012-01-25 21:35
bardon_2009
Rank: 2
等 级:论坛游民
帖 子:23
专家分:28
注 册:2012-1-14
收藏
得分:0 
以下是引用CooperOne在2012-1-25 21:35:29的发言:

这两段是等价的也就是说
Person *p
p=new Cservant(ID,Name,Duty,Workload);
等价于
Person *p=new Cservant(ID,Name,Duty,Workload);

通俗地说就是定义了指针同时调用了构造函数

我是这么理解的
谢谢指点,大家都这么说,心里就踏实了。
2012-01-28 09:41
快速回复:求助:如何理解这样的类指针用法,谢谢。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012551 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved