// CopyConstructor.cpp: 定义控制台应用程序的入口点。
//
//4_2.cpp
#include "stdafx.h"
#include <iostream>
using namespace std;
class Point { //Point 类的定义
public: //外部接口
Point(int xx = 0, int yy = 0) { //构造函数
x = xx;
y = yy;
}
Point(const Point &p); //拷贝构造函数
void setX(int xx)
{
x = xx;
}
void setY(int yy)
{
y = yy;
}
int getX() const {
return x;
}
int getY() const {
return y;
}
private: //私有数据
int x, y;
};
//成员函数的实现
Point::Point(const Point &p) {
x = p.x;//只能在类的成员函数中才能访问由本类定义的其他对象的私有成员1111111111111111111
y = p.y;
cout << "Calling the copy constructor" << endl;
}
//形参为Point类对象的函数
void fun1(Point p) {
cout << p.getX() << endl;
//p.setX(1);
}
//返回值为Point类对象的函数
Point fun2() {
Point a;
return a;
}
//主程序
int main() {
Point a; //第一个对象A
Point b(a); //情况一,用A初始化B。第一次调用拷贝构造函数
cout << b.getX() << endl;
fun1(b); //情况二,对象B作为fun1的实参。第二次调用拷贝构造函数
b = fun2(); //情况三,函数的返回值是类对象,函数返回时,调用拷贝构造函数为临时无名对象进行初始化,其次再为对象b进行赋值,此时不再调用拷贝构造函数
cout << b.getX() << endl;
return 0;
}
在未定义拷贝构造函数时,编译器将会自动生成一个拷贝构造函数。但是默认构造函数却不是这样的,如果定义了构造函数,却没有定义默认构造函数,则在定义新对象时必须进行初始化。
以下只有三种情况会调用拷贝构造函数:
一.用一个已知的对象去初始化另外一个新的对象
二.函数形参为某个类的对象
三.函数的返回值为某个类的对象
参考清华大学郑莉C++程序设计