构造函数:用于初始化对象的相关属性,如果程序员没有指定声明构造函数,则系统默认声明一个无内容,无参数的构造函数,如果程序员自己声明了一个带参数的构造函数,则系统不会再提供任何构造函数
拷贝构造函数:只有在三种情况下,才会调用拷贝构造函数,第一种情况:使用已有的对象为刚创建出来的对象初始化时调用,第二种情况:使用对象作为某个函数的实参传递时调用,第二种情况:当一个函数的返回值是一个类对象时,当函数返回时调用。如果程序员没有为类声明拷贝构造函数,则系统自己生成一个隐含的拷贝构造函数,这个拷贝构造函数的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应的数据成员。
以下是一个简单的例子:
Point.h文件
1 class Point 2 { 3 public: 4 Point(int x,int y); 5 Point(Point& p); 6 int getX(); 7 int getY(); 8 private: 9 int x,y; 10 };
Point.cpp文件
1 #include "Point.h" 2 #include <iostream> 3 4 Point::Point(int x =0,int y = 0){ 5 this->x=x; 6 this->y=y; 7 } 8 Point::Point(Point& p){ 9 x = p.x; 10 y = p.y; 11 std::cout << "calling this copy constractor;" << std::endl; 12 } 13 int Point::getX(){ 14 return this->x; 15 } 16 int Point::getY(){ 17 return this->y; 18 }
Main.cpp文件
1 #include <iostream> 2 #include "Point.h" 3 4 using namespace std; 5 6 void fun1(Point p){ 7 cout << p.getX() << endl; 8 } 9 10 Point fun2(){ 11 Point a(2,1); 12 return a; 13 } 14 15 int main(){ 16 Point a(4,5); //第一个对象a; 17 Point b = a; //情况一:用a初始化b,第一次条用拷贝构造函数 18 cout << b.getX() << endl; 19 fun1(b); //情况二:对象b作为fun1方法的实参,第二次调用拷贝构造方法 20 b = fun2(); //情况三:函数的返回值是类对象,函数返回时第三次调用拷贝构造函数 21 cout << b.getX() << endl; 22 return 0; 23 }
析构方法:
完成对象被删除前的一些清理工作,在对象的生存期结束之后,系统会自动调用它,然后再释放此对象所属的空间,如果程序中未声明析构函数,编译器将自动产生一个隐含的析构函数。