类与对象(下)
文章目录
(一) 类的6个默认成员函数
(1)构造函数
引出:当一个对象被实例化之后,怎么对其类 成员赋值呢?从前面整理的内容来看,我们在封装类的时候,可以指定一些函数来对成员进行赋值,比如:
class data
{
public:
void Initdata(int year,int month,int day)
{
m_year = year;
m_month = month;
m_day = day;
}
private:
int m_year;
int m_month;
int m_day;
};
但是这样的话,每次实例化对象时,都要去调用这个函数,未免太麻烦!嘛能不能实例化对象的时候就给对象设好初始值呢?
当然是可以的,构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员 都有 一个合适的初始值,并且在对象的生命周期内只调用一次。
class data
{
public:
//无参构造函数
data()
{
m_year = 2000;
m_month = 00;
m_day = 00;
}
//带参构造函数
data(int year,int month,int day)
{
m_year = year;
m_month = month;
m_day = day;
}
void Show()const
{
cout << m_year << "-" << m_month << "-" << m_day << endl;
}
private:
int m_year;
int m_month;
int m_day;
};
int main()
{
data d1;//调用无参构造函数,注意:不能加括号
data d2(2020, 6, 4);//调用带参构造函数
d1.Show();
d2.Show();
}
- 构造函数的作用是初始化对象
- 构造函数可以重载,如果用户没用定义的时候,系统会自动生成一个无参构造函数。
(2)拷贝构造函数
构造函数:只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对象 创建新对象时由编译器自动调用。
data(const data &d)
{
m_year = d.m_year;
m_month = d.m_month;
m_day = d.m_day;
}
int main()
{
data d2(2020, 6, 4);//调用带参构造函数
data d3(d2);//调用拷贝构造函数
}
特征 :
- 拷贝构造函数是构造函数的一个重载形式。
- 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。
用法:
- 用对象初始化对象时
- 函数参数为对象传递时
- 以对象作为返回值时
(3)赋值操作符重载
运算符重载是具有特殊函数名的函数,也具有其返回值类 型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
//赋值——等号重载
data& operator=( const data &d)
{
if (this != &d)
{
m_year = d.m_year;
m_month = d.m_month;
m_day = d.m_day;
}
return *this;
}
int main()
{
data d1;//调用无参构造函数,注意:不能加括号
data d2(2020, 6, 4);//调用带参构造函数
data d4;
d4 = d2;//用d2给d4赋值
}
注意:
- 参数类型
- 返回值
- 检测是否自己给自己赋值
- 返回*this
- 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。
(4)析构函数
与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。
~data()
{
}
其特征如下:
- 析构函数名是在类名前加上字符 ~。
- 无参数无返回值。
- 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
- 对象生命周期结束时,C++编译系统系统自动调用析构函数。
(5)普通对象和常对象取地址
这两个默认成员函数一般不用重新定义 ,编译器默认会生成。
data* operator&()
{
return this;
}
const data* operator&()const
{
return this;
}
文章系本人原创,转载请注明作者和出处。