类的6个默认成员函数包括:构造函数,析构函数,拷贝构造函数,赋值运算符重载函数,取地址操作符重载,const修饰的取地址操作符重载
(一)构造函数
构造函数为对象分配空间,初始化对象
特点 :
1.函数名与类名相同。
2.无返回值。
3.构造对象时系统自动调用,不需要调用
4.可以重载。
5.可以在类中定义也可以在类外定义。
6.如果类无构造函数,编译器会自动生成一个缺省的构造函数,如果类中有构造函数,则不生成
7全缺省构造函数和构造函数只能有一个,否则冲突
8.构造函数没有this 指针,因为构造函数创建对象的,没有创建就没有首地址例如
例如:日期类
#include<iostream>
using namespace std;
class Date
{
public:
Date()//无参构造函数
{
_year = 2019;
_month = 9;
_date = 26;
}
Date(int year = 2018,int month = 9,int date = 26)//全缺省构造函数
{
_year = year;
_month = month;
_date = date;
}
Date(int year ,int month, int date):_year(year),_month(month),_date(date)//初始化列表初始化成员函数
{
}
void Print()
{
cout << _year << "-" << _month << "-"<< _date << endl;
}
private:
int _year;
int _month;
int _date;
}
int main()
{
Date d1(2019,9,26);
d1.Print();
system("pause");
return 0;
}
初始化列表初始化成员函数效率最高,在同一个类中无参构造函数与全缺省构造函数同时存在,函数冲突,无法运行。
(二)析构函数
析构函数具有特点:
1.析构函数函数名是在类名前加~
2.无参数无返回值,但有this指针
3.一个类有且只有一个析构函数,所以不能重载。
4.对象生命周期结束,系统自动调用析构函数。
5.析构函数并不是删除对象,而是清理构造函数动态开辟的空间
(三)拷贝构造函数
用已有的对象创建新对象
如:
调用拷贝构造函数的两种方法:
1.代入法:
Date d2(d1);
2.赋值法:
Date d2 = d1;
(四)赋值运算符重载函数
特点:
1.参数类型
2.返回值
3.检测是否给自己赋值
4.返回this指针
5类如果没有定义赋值运算符重载,编译器会生成默认函数,完成对象按字节序的值拷贝
像日期类等简单类可以用编译器自己生成的复制重载函数完成字节序的值拷贝
//String 类
class String
{
public:
String(const char **str ="jack")
{
_str = (char *)malloc(strlen(str)+1);
strcpy(_str,str);
}
~String()
{
cout<<"String"<<endl;
free(_str);
}
String& operator=(const String&s)
{
if(this != &s)
{
char *pstr = (char *)malloc(strlen(s._str)+1);
strcpy(pstr,s._str);
delete[]_str;
_str = pstr;
}
}
private:
char * _str;
}
int main()
{
String s1("hello");
String s2("world");
s1 =s2;
}
(五)取地址操作符的重载
Date * operator&()
{
return this;
}
(六)const 修饰的取地址操作符的重载
const Date * operator*()
{
return this
}
函数后面的const 表明在函数内不能改变对象的成员,返回值是指向常对象的指针