第9周项目3- 数不定的工资类(复制构造函数)

来源:互联网 发布:mac美服lol加速器 编辑:程序博客网 时间:2024/05/01 02:30
/*Copyright (c) 2016, 烟台大学计算机学院               *All rights reserved.               *文件名称:c8weeks.cpp               *作者:张天择              *完成日期:2016年 5月29日               *版本号:vc++6.0               */          

【项目-人数不定的工资类】
设计一个工资类(Salary),其中的数据成员包括职工人数(number,人数不定)和number个职工的工资salary,要求输入职工工资并逐个输出。
提示:用固定大小的数组存储number个职工的工资,可能造成空间的浪费,也可能会由于空间不够而不能处理职工人数过多的应用。将salary声明为指针类型的成员,通过动态分配空间,分配正好大小的空间存储数据。
#include<iostream>using namespace std;class Salary{public:    Salary(int n);    Salary(const Salary &s);        ~Salary();    void input_salary();    void show_salary();private:    double *salary;    int number;};Salary::Salary(int n){    number=n;    salary = new double[number];  //根据职工人数,确定分配空间的大小}Salary::Salary(const Salary &s){    number = s.number;    salary = new double[number];    for(int i=0;i<number; ++i)        *(salary+i)=*(s.salary+i);}Salary::~Salary(){    delete []salary;   //必须在析构函数中释放动态分配的空间}void Salary::input_salary(){    int i;    cout << "请输入"<<number<<"名职工的工资:" << endl;    for(i = 0; i < number; ++i)     cin >> *(salary+i);    return ;}void Salary::show_salary(){    cout << "职工工资清单: " ;    for(int i = 0; i < number; ++i)        cout << *(salary+i)<<" ";    cout << endl;    return ;}int main(){    Salary s1(10);    s1.input_salary();    Salary s2(s1);    s1.show_salary();     s2.show_salary();    return 0;}

复制构造函数

  就类对象而言,相同类型的类对象是通过复制构造函数来完成整个复制过程的。

  上例中的Test::Test(const Test& C),就是我们自定义的复制构造函数

  可见,复制构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,用来约束作为参数的对象在构造新对象中是不能被改变的。

  略一归纳:类X的复制构造函数的形式为X(X& x)

  当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,复制构造函数就会被自动调用。也就是说,当类的对象需要复制时,复制构造函数将会被调用。以下情况都会调用复制构造函数:

  • 一个对象以值传递的方式传入函数体
  • 一个对象以值传递的方式从函数返回
  • 一个对象需要通过另外一个对象进行初始化。

  如果在类中没有显式地声明一个复制构造函数,那么,编译器将会自动生成一个默认的复制构造函数,该构造函数完成对象之间的浅复制,后面将进行说明。

  自定义复制构造函数是一种良好的编程风格,它可以阻止编译器形成默认的复制构造函数,提高源码效率。


 

0 0
原创粉丝点击