注:若类中没有显示的写如下函数,编译会自动生成:默认复制构造函数、默认赋值构造函数(浅拷贝)、默认=运算符重载函数(浅拷贝)、析构函数;
1、默认构造函数(默认值)构造函数的作用:初始化对象的数据成员。
2、复制构造函数 作用:用已存在的对象初始化新建的对象的数据成员。
类对象作为形参,如果参数是引用传递则不会调用任何复制构造函数;如果是按值传递,则会调用复制构造函数
3、=运算符重载
两个对象已存在;
4、深拷贝
为类的指针成员变量重新分配内存;
5、浅拷贝(编译器默认生成的复制构造函数为浅拷贝函数)
6、析构函数
用于完成对象删除前的清理工作。
#include "stdafx.h" #include "string" #include <iostream> using namespace std; class Person { public: int nAge; //年龄 double dbHeight; //身高 //char *name; //姓名 public: //1、默认构造函数(无参) /* 1、如果创建一个类没有任何构造函数,则系统会自动生成一个默认的无参构造函数,函数体为空; 2、如果存在一个构造函数,系统就不会生成一个默认的构造函数,如果希望有一个无参的构造函数,则需要手动添加。 3、只允许有一个默认构造函数 */ Person() { nAge = 18; dbHeight = 165; //name = new char[100]; } //2、默认构造函数(浅拷贝函数)(所有参数为默认值的函数也为默认构造函数) /*Person(int nAge = 16, double dbHeight = 175) { this->nAge = nAge; this->dbHeight = dbHeight; }*/ //3、复制构造函数(也称为拷贝构造函数)(等号右边类对象的值已被创建) /* 1、复制构造函数参数为类对象本身的引用,根据已存在的对象复制出一个新的该类的对象,通常在函数中将已存在对象的数据成员的值复制一份到新创建的对象中; 2、类中若没有显示的写复制构造函数,则系统会默认创建一个复制构造函数,但当类中有指针成员时,由系统创建的该默认构造函数会有风险(深拷贝和浅拷贝); */ //4、=运算符重载(等号左右两边类对象的值都已被创建) /* 1、将等号右边类对象的值,复制给等号左边类对象; */ Person &operator=(const Person &p) { //检查左右两边是否是否为同一对象,相同则直接返回 if (this == &p) { return *this; } //复制等号右边的成员到左边的对象中 this->nAge = p.nAge; this->dbHeight = p.dbHeight; return *this; } Person(const Person & p) { nAge = p.nAge; dbHeight = p.dbHeight; } void showAge(Person p) //按值传递 { cout <<"年龄:"<<p.nAge<<endl; } void showHeight(Person &p) //按引用传递 { cout <<"身高:"<<p.dbHeight<<endl; } void showAgeHeight(Person *p) //按指针传递 { cout <<"年龄:"<<p->nAge<<endl; cout <<"身高:"<<p->dbHeight<<endl; } //析构函数 /*~Person() { delete name; }*/ }; int _tmain(int argc, _TCHAR* argv[]) { Person p1,p2; //调用无参构造函数 //Person p3 =p2; //调用复制构造函数 //p1.showAge(p1); //调用复制构造函数(不会调用无参构造函数) //p1.showHeight(p1); //引用传递不会调用复制构造函数 //p1 = p2; //调用=运算符重载函数 //p1.showAgeHeight(&p1); //指针传递不会调用复制构造函数 return 0; }