Version 3.0
特殊的函数第四章
2
回顾

成员变量
成员函数
this 指针
对象数组
3
目标
复制构造函数
复制赋值操作符
类型转换构造函数
类型转换函数
4
复制构造函数 3-1
在下列情况,会调用复制构造函数
– 将某个对象初始化为类的另一个对象时
– 将对象当作参数传递给函数时
– 函数返回对象时
5
复制构造函数 3-2
如果没有定义复制构造函数,编译器将自动生成一个
自动生成的复制构造函数只是将对象内容逐个字节地 copy
当数据成员有指针时,将导致两个对象的指针指向同一个地址
6
复制构造函数 3-3
定义以对象的引用作为参数的构造函数
X::X(X &ptr)

X::X(const X &ptr)
使用 const 关键字,可以确保复制过程不会意外地更改源对象
7
赋值操作符 4-1
默认的赋值操作符只是逐个字节地将源对象复制到目标对象
#include <iostream.h>
class Var1 {
int * ptr;
public:
Var1() {
ptr = new int;
*ptr = 0;
}
Var1(int i) {
ptr = new int;
*ptr = i;
}
void show ()
{
cout << *ptr << endl;
}
};
void main()
{
Var1 s1(20);
Var1 s2;
s2.show();
s2 = s1;
s2.show();
}
s2的 ptr和 s1的 ptr
指到同一个位置
8
赋值操作符 4-2
演示默认的赋值操作符
9
赋值操作符 4-3
增加:
Var1 & operator = (const Var1 & s)
{
*ptr = *(s.ptr);
return *this;
}
两个对象的 ptr指向不同的位置
10
赋值操作符 4-4
演示自定义赋值操作符
11
类型转换构造函数 4-1
基本数据类型 用户自定义类型
Distance(float m)
{
float f;
f = (float)3.28 * m;
feet = int(f);
inches = 12 * (f - feet);
}
Distance d1 = 1.25;
12
类型转换构造函数 4-2
演示 基本数据类型 到用户自定义类型的转换
13
类型转换构造函数 4-3
用户自定义类型 用户自定义类型
LFeet::LFeet (LMetres dm) {
float ffeet;
ffeet = float(3.28 * dm.GetMetres());
feet = int(ffeet);
inches = int(12 * (ffeet - feet));
}
int LMetres::GetMetres() {
return metre;
}
14
类型转换构造函数 4-4
演示 用户自定义类型的互转
15
类型转换函数
编译器对用户自定义的类型一无所知,必须定义转换函数
基本数据类型 用户自定义类型类型转换函数
用户自定义类型 用户自定义类型
16
从用户自定义类型到基本类型
operator float() //转换函数是类型转换操作符的重载
{
float f;
f = inches / 12;
f = feet + f;
return (float)(f / 3.28);
}
Distance d1(4,1.2f);
Distance d2(6,6.72f);
float m = float(d1) ; //显式调用转换函数
m = d2; //隐式调用转换函数
17
不同类的对象的转换
编译器对用户自定义的类型一无所知,必须指定转换函数
objectA = objectB;
两种实现方法
– 在目标类中定义的类型转换构造函数(已介绍)
– 在源类中定义的转换函数目标类的对象 源类的对象
18
源类中的转换函数
operator DistFeet()
{
float f_feet;
float inches;
int i_feet ;
f_feet = (float)3.28 * meters ;
i_feet = int (f_feet);
inches = 12 * (f_feet - i_feet);
return (DistFeet(i_feet,inches));
}
DistMeters dm1 = 1.0;
DistFeet df1;
df1 = dm1; //隐式使用转换函数或
df1 = DistFeet (dm1); //显式使用转换函数
19
类型转换表转换类型 目标类中的函数 源类中的函数从基本类型到类 构造函数 不可以从类到基本类型 不可以 转换函数从类到类 构造函数 转换函数
20
总结
复制构造函数
复制赋值操作符
类型转换构造函数
类型转换函数