常见函数
构造函数
- 构造函数和类同名,无返回值。
- 构造函数完成成员的初始化工作。
- 对象创建时,编译系统对对象分配内存空间,并自动调用该构造函数。
- 构造函数的种类以及特点:
4.1 无参构造函数(默认构造参数)
4.1.1 如果创建的一个类,没有写任何构造函数,则系统会自动生成一个不带参数的默认构造函数,函数为空,什么都不做。
4.1.2 如果写了一个不带参数的构造函数,则系统不会再自动生成这样一个默认构造函数。
4.2 一般构造函数(重载构造函数)
4.2.1 一个类可以有多个一般构造函数,但是参数类型或者参数个数必须不同;
4.3 拷贝构造函数
4.3.1 拷贝构造函数的参数为类对象本身,用于根据一个已存在的对象复制出一个新的该类的对象。
4.3.2 如果没有显示的写一个拷贝构造函数,系统会自动创建一个拷贝构造函数,
4.3.3 深拷贝:自定义拷贝构造函数,可以防止编译器自动生成一个默认拷贝构造函数,当这个类对象发生复制过程时,会重新分配资源;
4.3.4 浅拷贝:编译器自动生成的默认拷贝构造函数,该构造函数完成对象之间的位拷贝,又叫浅拷贝。浅拷贝没有重新分配资源,把对象的值完成复制给另外一个对象,这时同时指向了一块内存,如果前者对象中的一个指针成员变量delete释放掉了,那后者对象中的指针变量就变成了一个野指针,所以避免浅拷贝。
4.4 等号运算符重载
4.1.1 如果不自定重载等号,等号只能完成简单的拷贝工作。
4.1.2 不属于构造函数;将等号右边的对象赋值给等号左边的对象,等号左右两边的对象必须都已经存在。
#include<iostream>
#include<string>
using namespace std;
class People
{
public:
//定义了一个无参的构造函数,此时系统不会在自己创建一个默认构造函数;
People()
{
name = "HCJ";
}
//一般构造函数
People(string name)
{
this->name = name;
cout<<"My name is "<<this->name<<endl;
}
People(string name,string sex)
{
this->name = name;
this->sex = sex;
cout<<"My name is "<<this->name<<"! I am "<<this->sex<<endl;
}
//拷贝构造函数
People(const People &c)
{
name = c.name;
sex = c.sex;
}
//重载等号
People &operator=(const People &r)
{
//如果等号左边的就是等号右边的对象本身,就返回对象本身
if(this == &r)
{
return *this;
}
this->name = name;
this->sex = sex;
return *this;
}
string name;
string sex;
};
int main()
{
//默认构造函数
People p;
cout<<p.name<<endl;
//一般构造函数
string name = "huochangjun";
string sex = "F";
People pp(name);
People ppp(name,sex);
//拷贝构造函数
People p1(ppp);
cout<<"P1 name "<<p1.name<<endl;
cout<<"P1 sex "<<p1.sex<<endl;
//重载等号
People p2;
p2=p1;
cout<<"P2 name "<<p2.name<<endl;
cout<<"P2 sex "<<p2.sex<<endl;
return 0;
}