工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 5660|回复: 9

如何处理C++类初时化问题

[复制链接]
发表于 2006-12-9 12:01 | 显示全部楼层 |阅读模式

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Employee
  5. {
  6. public:
  7.      Employee(){name="王五";street="24";city="44";zip=85345;}
  8.      //Employee (string name="张三", string street="24", string city="44", int zip=85345);
  9.      //:name(name),street(street),city(city),zip(zip){};
  10.      
  11.      Employee(const Employee&e);
  12.      ~Employee();
  13.      void display();
  14.      void change_name(string);
  15.      void setstreet(string);
  16.      void setcity(string);
  17.      void setzip(int);
  18. private:
  19.      string name;
  20.      string street;
  21.      string city;
  22.      int zip;
  23. };
  24.   
  25.      

  26. Employee::Employee(const Employee &e)
  27. {
  28.     name=e.name;
  29.     street=e.street;
  30.     city=e.city;
  31.     zip=e.zip;
  32. }
  33. void Employee::display()
  34. {
  35.      cout<<"  姓  名:"<<name<<"\n"<<"街道地址:"<<street<<endl;
  36.      cout<<"  城  市:"<<city<<"\n"<<"邮政编码:"<<zip<<endl;
  37.      cout<<endl;
  38. }
  39. inline void Employee::change_name(string new_name)
  40. {
  41.      name = new_name;
  42. }
  43. void Employee::setstreet(string new_street)
  44. {
  45.      street = new_street;
  46. }
  47. void Employee::setcity(string new_city)
  48. {   
  49.      city = new_city;
  50. }
  51. void Employee::setzip(int new_zip)
  52. {
  53.      zip = new_zip;
  54. }
  55. Employee::~Employee(){cout<<"调用";}

  56. int main()
  57. {int c;
  58.      Employee *Pointer;
  59.      Employee person1;
  60.      Pointer=&person1;
  61.      person1.setcity("string");
  62.      Pointer->display();
  63.      Employee person2("mjm","xixia","nanjin",468);
  64.      Employee person3(person1);
  65.      person2.change_name("Jiaming Mao");
  66.      person2.change_name("李四");
  67.      person3.setzip(54654654);
  68.      person2.display();
  69.      person3.display();
  70.      cin>>c;
  71.      cin>>c;
  72. }
复制代码


要求定义三个Employee类对象Person1, Person2, Person3,分别用缺省构造函数、带默认形参值的构造函数,拷贝构造函数初试化。前两种初始化如何实现

  1. Employee(){name="王五";street="24";city="44";zip=85345;}
  2. Employee (string name="张三", string street="24", string city="44", int zip=85345);
  3. : name(name),street(street),city(city),zip(zip){};
复制代码

不能一起存在啊
 楼主| 发表于 2006-12-9 12:11 | 显示全部楼层
请教多一个为问题
指针Pointer分别与对象Person1, 或Person2, 或Person3调用Employee类成员函数怎么实现,我只能调用一个
回复

使用道具 举报

发表于 2006-12-9 12:40 | 显示全部楼层
Employee(){name="王五";street="24";city="44";zip=85345;}
Employee (string name="张三", string street="24", string city="44", int zip=85345);
: name(name),street(street),city(city),zip(zip){};

改成
Employee(){name="王五";street="24";city="44";zip=85345;}
Employee (string name="张三", string street="24", string city="44", int zip=85345)
: name(name),street(street),city(city),zip(zip){};


结果还是不行,原因是这两个构造函数都可以 Employee e 这样调用,也就是说,当你这样写的时候,不知道该调用哪个好。

解决方法,把第二个构造函数的其中前一个或两个或三个默认值去掉。如:

Employee(){name="王五";street="24";city="44";zip=85345;}
Employee (string name, string street="24", string city="44", int zip=85345)
:name(name),street(street),city(city),zip(zip){};


至于指针调用,每次让它指向不同对象,然后调用就可以了。
回复

使用道具 举报

 楼主| 发表于 2006-12-9 13:21 | 显示全部楼层
主要问题是如何在一个程序中用缺省构造函数、带默认形参值的构造函数分别初始化对象
按楼上这么改,如何完全只使用默认值而调用
Employee (string name, string street="24", string city="44", int zip=85345)
:name(name),street(street),city(city),zip(zip){};
这句呢

[ 本帖最后由 liuaa24 于 2006-12-9 14:21 编辑 ]
回复

使用道具 举报

发表于 2006-12-9 16:54 | 显示全部楼层
原帖由 liuaa24 于 2006-12-9 13:21 发表
主要问题是如何在一个程序中用缺省构造函数、带默认形参值的构造函数分别初始化对象
按楼上这么改,如何完全只使用默认值而调用
Employee (string name, string street="24", string city="44 ...


如果楼上认为带默认形参值的构造函数是全部参数都有默认值的话,那是不行的。
因为全部参数都有了默认值,可以当无参数的构造函数来使用,而当你这样用的时候,程序不知道该调用哪个构造函数。


如果那样做的话,错误提示:

call of overloaded `Employee()' is ambiguous
candidates are: Employee::Employee(std::string, std::string, std::string, int)
Employee::Employee()
回复

使用道具 举报

 楼主| 发表于 2006-12-9 19:34 | 显示全部楼层
所以觉得老师的要求是无聊的
回复

使用道具 举报

发表于 2006-12-9 19:37 | 显示全部楼层
他没要求你要全用默认参数...

只是让你们实践下这种用法...
回复

使用道具 举报

 楼主| 发表于 2006-12-9 19:47 | 显示全部楼层
原帖由 iptton 于 2006-12-9 19:37 发表
他没要求你要全用默认参数...

只是让你们实践下这种用法...

定义三个Employee类对象Person1, Person2, Person3,分别用缺省构造函数、带默认形参值的构造函数,拷贝构造函数初试化。
按照字面理解应该是全默认的
回复

使用道具 举报

发表于 2006-12-9 20:06 | 显示全部楼层
全缺省与无参形式是不能共存的...

这个老师不可能不知道

通过这个你也能学会这个知道点
“歧义性”ambiguous
回复

使用道具 举报

发表于 2006-12-9 20:19 | 显示全部楼层
照我理解全缺省参数不应该存在,

除非你只有这一种 constructor

[ 本帖最后由 iptton 于 2006-12-9 20:44 编辑 ]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-16 03:10

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表