uot;<<day<<endl; }
void main()
{
Date date1; // 声明类Date的对象date1,
// 调用无参数的构造函数
cout<<"Date1 output: "<<endl;
date1.showDate(); // 调用date1的showDate(),显示date1的数据
Date date2(2002, 11, 14); // 定义类Date的对象date2,
// 调用带参数的构造函数
cout<<"Date2 output: "<<endl;
date2.showDate(); // 调用date2的showDate(),显示date2的数据
}
运行结果:
Date1 output:
1998.4.28
Date2 output:
2002.11.14
例2.18 关于计时器的例子
#include<iostream.h>
#include<stdlib.h>
class timer{
public:
timer() // 无参数构造函数,给seconds清0
{ seconds=0; }
timer(char* t) // 含一个数字串参数的构造函数
{ seconds=atoi(t); }
timer(int t) // 含一个整型参数的构造函数
{ seconds=t; }
timer(int min,int sec) // 含两个整型参数的构造函数
{ seconds=min*60+sec; }
int gettime()
{ return seconds; }
private:
int seconds;
};
main()
{
timer a,b(10),c("20"),d(1,10);
cout<<"seconds1="<<a.gettime()<<endl;
cout<<"seconds2="<<b.gettime()<<endl;
cout<<"seconds3="<<c.gettime()<<endl;
cout<<"seconds4="<<d.gettime()<<endl;
return 0;
}
class x {
public:
x(); // 没有参数的构造函数
x(int i=0); // 带缺省参数的构造函数
};
//…
void main()
{
x one(10); // 正确,调用x(int i=0)
x two; // 存在二义性
//…
}
5. 拷贝构造函数
拷贝构造函数是一种特殊的构造函数,其形参是本类对象的引用。其作用是使用一个已经存在的对象去初始化另一个同类的对象。
- 通过等于号复制对象时,系统会自动调用拷贝构造函数。
- 拷贝构造函数与原来的构造函数实现了函数的重载。
拷贝构造函数具有以下特点:
- (1) 因为该函数也是一种构造函数,所以其函数名与类名相同,并且该函数也没有返回值类型。
- (2) 该函数只有一个参数,并且是同类对象的引用。
- (3) 每个类都必须有一个拷贝构造函数。程序员可以根据需要定义特定的拷贝构造函数,以实现同类对象之间数据成员的传递。如果程序员没有定义类的拷贝构造函数,系统就会自动生成产生一个缺省的拷贝构造函数。
5.1 自定义拷贝构造函数
自定义拷贝构造函数的一般形式如下:
class 类名{
public :
类名(形参); //构造函数
类名(类名 &对象名); //拷贝构造函数
...
};
类名:: 类名(类名 &对象名) //拷贝构造函数的实现
{ 函数体 }
用户自定义拷贝构造函数
class Coord{
int x,y;
public:
Coord(int a, int b) // 构造函数
{
x=a;
y=b;
cout<<"Using normal constructor\n";
}
Coord(const Coord& p) // 拷贝构造函数
{
x=2*p.x;
y=2*p.y;
cout<<"Using copy constructor\n";
}
//…
};
如果p1、 p2为类Coord的两个对象,p1已经存在,则coord p2(p1)调用拷贝构造函数来初始化p2
例2.19 自定义拷贝构造函数的使用
#include<iostream.h>
class Coord {
public:
Coord(int a,int b) // 构造函数
{ x=a; y=b; cout<<"Using normal constructor\n";}
Coord(const Coord& p) // 拷贝构造函数
{ x=2*p.x; y=2*p.y; cout<<"Using copy constructor\n";}
void print(){ cout<<x<<" "<<y<<endl; }
private:
int x,y;
};
main()
{
Coord p1(30,40); // 定义对象p1,调用了普通的构造函数
Coord p2(p1); // 以“代入” 法调用拷贝构造函数,用对象p1初始化对象p2
p1.print();
p2.print();
return 0;
}
除了用代入法调用拷贝构造函数外,还可以采用赋值法调用拷贝构造函数,如:
main()
{
Coord p1(30,40);
Coord p2=p1; //以"赋值"法调用拷贝构造函数,
用对象p1初始化对象p2
//…
}
5.2 缺省的拷贝构造函数
如果没有编写自定义的拷贝构造函数,C++会自动地将一个已存在的对象复制给新对象,这种按成员逐一复制的过程由是缺省拷贝构造函数自动完成的。
例2.20 调用缺省的拷贝构造函数
#include<iostream.h>
class Coord{
public:
Coord(int a,int b)
{ x=a; y=b; cout<<"Using normal constructor\n"; }
void print(){ cout<<x<<" "<<y<<endl;}
private:
int x,y;
};
main()
{
Coord p1(30,40); // 定义类Coord的对象p1,
// 调用了普通构造函数初始化对象p1
Coord p2(p1); // 以“代入”法调用缺省的拷贝构造函数,
// 用对象p1初始化对象p2
Coord p3=p1; // 以“赋值”法调用缺省的拷贝构造函数,
// 用对象p1初始化对象p3
p1.print(); p2.print(); p3.print();
return 0;
}
5.3 调用拷贝构造函数的三种情况