复制构造函数31 在下列情况,会调用复制构造函数 将某个对象初始化为类的另一个对象时 将对象当作参数传递给函数时 函数返回对象时 北大青鸟
4 复制构造函数 3-1 • 在下列情况,会调用复制构造函数 – 将某个对象初始化为类的另一个对象时 – 将对象当作参数传递给函数时 – 函数返回对象时
复制构造函数32 如果没有定义复制构造函数,编译器将自 动生成一个 自动生成的复制构造函数只是将对象内容 逐个字节地copy 当数据成员有指针时,将导致两个对象的 指针指向同一个地址 北大青鸟
5 复制构造函数 3-2 • 如果没有定义复制构造函数,编译器将自 动生成一个 • 自动生成的复制构造函数只是将对象内容 逐个字节地copy • 当数据成员有指针时,将导致两个对象的 指针指向同一个地址
复制构造函数33 定义 以对象的引用作为参数的构造函数 X:: X(X &ptr 或 X:: X(const x &ptr) 使用 const关键字,可以确保复制过程不会 意外地更改源对象 6 北大青鸟
6 复制构造函数 3-3 • 定义 以对象的引用作为参数的构造函数 X::X(X &ptr) 或 X::X(const X &ptr) • 使用 const 关键字,可以确保复制过程不会 意外地更改源对象
赋值操作符41 默认的赋值操作符只是逐个字节地将源对 象复制到目标对象 #include void main o class varl int ptr; vax1s1(20); public: Var1 s2 Vario i s2.sh。w(); ptr new inti 2 s1 七r s2.sh。w() Varl (int i)[ p七r new ln七 ptr=工 s2的ptr和s1的ptr void show ( 到同一个 cout < *ptr < endli 北大青鸟
7 赋值操作符 4-1 • 默认的赋值操作符只是逐个字节地将源对 象复制到目标对象 #include 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 指到同一个位 置