类和对象【中】

一、拷贝构造函数

函数名:类名
返回值:没有
参数类型:类名&
参数必须是引用(一般加const),如果不是引用,就会陷入死循环,就是实参传给新创建的形参需要调用拷贝构造函数,一直调用,引用当传参就不需要调用拷贝构造函数
1.拷贝构造函数在已存在的类类型对象拷贝新创建的这个类类型对象时自动调用,拷贝构造函数也是默认成员函数
2.他是一种特殊的构造函数,构造函数的一种重载

class a:
{
	public:
	a(int d=7)
	{
		d=i;
	}
	a(const a& d)
	{
		*this.e=d.e;
	}
	private:
		int e;

4.没有自己定义拷贝构造函数,系统默认生成的构造函数就把内存按字节的方式全拷贝到新创建的对象里,也就是浅拷贝,在成员变量都是内置类型时用编译器写的默认拷贝构造函数就行,但是这个类有成员变量动态内存申请,例如栈,顺序表,就需要自己创造拷贝构造函数,如果浅拷贝,这个类类型对象离开作用域就会自动调用析构函数,拷贝的堆里地址的指针被释放,被拷贝的类类型对象再析构就会出bug

int main()
{
stack d1;
{
stack d2(d1)
}
;//用系统生成的拷贝构造函数,d2析构,d1析构出bug

return 0;
}

二、运算符重载

运算符重载增强代码可读性,参数是运算符对应的操作数
函数名字:关键字operator+重载的运算符
函数原型:返回值类型 operator操作符(参数)
1.不能把不是运算符的符号重载
2.重载运算符函数必须有一个类类型形参
3.重载的运算符本身含义不能改变
4.重载运算符函数是成员函数少一个操作数,其实是隐藏的this
5. :: 作用域限定符 , : ?三目运算符, .调用类里的对象, .* 调用成员函数指针, sizeof算字符 这五个运算符不能重载

class Date
{
public:
Date(int year = 2023, int month = 7, int day = 20)
 {
    _year = year;
    _month = month;
    _day = day;
 }  
int _year;
int _month;
int _day;
};
bool operator==(const Date& d1, const Date& d2)
{
  return d1._year == d2._year
 && d1._month == d2._month
    && d1._day == d2._day;
}
void test
{
	Date a;
	Date b;
	cout<< a==b<<endl;
}

三、赋值重载函数

函数名:operator=
返回类型:类名&
参数类型:类名&
参数传引用调高效率,不拷贝构造,类名引用前一般加const
返回类型是引用提高效率,返回不用创建临时对象
1.复制重载函数是将一个类类型对象赋值给其他存在的这个类类型对象,是默认成员函数(和拷贝构造函数的区别是这个要拷贝的对象已经存在)
2.返回是*this,符合连续赋值
3.赋值重载只能是成员函数,不然编译器默认生成默认赋值重载函数,和自己在类外实现的冲突
4.默认生成的赋值重载函数就是浅拷贝

class Date
{
public :
Date(int year = 2023, int month = 7, int day = 20)
 {
    _year = year;
    _month = month;
    _day = day;
 }
Date (const Date& d)
 {
    _year = d._year;
    _month = d._month;
    _day = d._day;
 }
Date& operator=(const Date& d)
{
if(*this != d)
   {
      _year = d._year;
      _month = d._month;
      _day = d._day;
   }
    return *this;
}
private:
int _year ;
int _month ;
int _day ;
};

五、前置++、后置++重载

前置++和后置++,操作数,值,参数都一样
祖师爷为了区分
前置++:类名& operator++()

class Date
{
public:
Date(int year = 2023, int month = 7, int day = 20)
{
_year = year;
_month = month;
_day = day;
}
Date& operator++()
{
_day += 1;
return *this;
}
private:
int _year;
int _month;
int _day;
};

后置++
类名& operator++(int)
多出个int单纯和前置++做区分,传了也不影响,不传也没事

class Date
{
public:
Date(int year = 2023, int month = 7, int day = 20)
{
_year = year;
_month = month;
_day = day;
}
Date operator++(int)
{
Date temp(*this);
_day += 1;
return temp;
}
private:
int _year;
int _month;
int _day;
}

总结

取地址重载函数及const取地址重载函数也是默认成员函数,一般不用自己定义,用编译器默认生成的就行,这样六大默认生成函数就都写完了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值