Point类
class Point{
public:
Point(int xx, int yy){ //构造函数
x = xx;
y = yy;
}
Point(Point &p); //复制构造函数
int getX(){
return x;
}
int getY() {
return y;
}
private:
int x, y;
};
Point::Point(Point &p) {
x = p.x;
y = p.y;
cout << "Calling the copy constructor" << endl;
}
1 当用类的一个对象去初始化该类的另一个对象时。
int main(){
Point a(1, 2);
Point b(a); //用对象a初始化对象b,复制构造函数被调用
Point c = a; //用对象a初始化对象c,复制构造函数被调用
cout << b.getX() << endl;
return 0;
}
结果:
2 如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。
void f(Point p) {
cout << p.getX() << endl;
}
int main(){
Point a(1, 2);
f(a); //函数的形参为类的对象,当调用函数时,复制构造函数被调用
return 0;
}
结果:
注意:只有把对象用值传递时,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。
3 如果函数的返回值是类的对象,函数执行完成返回调用者时。
Point g() {
Point a(1, 2);
return a; //函数的返回值是类对象,返回函数值时,调用复制构造函数
}
int main(){
Point b;
b = g();
cout << b.getX();
return 0;
}
注意:在有些编译环境下,上面运行结果可能不尽相同,因为编译器有时会针对复制构造函数的调用做优化,避免不必要的复制构造函数的调用。故这里本应该有复制构造函数的调用的,但由于编译器进行了优化,没有调用复制构造函数。
4 Point类完整代码
//4-2Point类完整程序
#include <iostream>
using namespace std;
class Point{
public:
Point(int xx = 0, int yy = 0){ //构造函数
x = xx;
y = yy;
}
Point(Point &p); //复制构造函数
int getX(){
return x;
}
int getY() {
return y;
}
private:
int x, y;
};
Point::Point(Point &p) {
x = p.x;
y = p.y;
cout << "Calling the copy constructor" << endl;
}
void fun1(Point p) {
cout << p.getX() << endl;
}
Point fun2() {
Point a(1, 2);
return a; //函数的返回值是类对象,返回函数值时,调用复制构造函数
}
int main(){
Point a(4, 5);
Point b = a; //用a初始化b,第一次调用复制构造函数
cout << b.getX() << endl;
fun1(b); //用对象b作为fun1的实参,第二次调用复制构造函数
b = fun2(); //函数的返回值是类对象,函数返回时,调用复制构造函数
cout << b.getX() << endl;
return 0;
}