浅谈C++(3)——类与对象(下)

类与对象(下)





(一) 类的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();
}
  1. 构造函数的作用是初始化对象
  2. 构造函数可以重载,如果用户没用定义的时候,系统会自动生成一个无参构造函数。

(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);//调用拷贝构造函数
}

特征 :

  1. 拷贝构造函数是构造函数的一个重载形式。
  2. 拷贝构造函数的参数只有一个且必须使用引用传参,使用传值方式会引发无穷递归调用。

用法:

  1. 用对象初始化对象时
  2. 函数参数为对象传递时
  3. 以对象作为返回值时

(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赋值
}

注意:

  1. 参数类型
  2. 返回值
  3. 检测是否自己给自己赋值
  4. 返回*this
  5. 一个类如果没有显式定义赋值运算符重载,编译器也会生成一个,完成对象按字节序的值拷贝。

(4)析构函数

        与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而 对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

~data()
	{

	}

其特征如下:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值。
  3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

(5)普通对象和常对象取地址

        这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

data* operator&()    
{ 
	return this;
}  

const data* operator&()const   
{
	return this; 
}

文章系本人原创,转载请注明作者和出处。

猜你喜欢

转载自blog.csdn.net/xiaomu_Y/article/details/106541196