快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C++类和对象(二)-创新互联

4赋值重载函数
Date& operator=(const Date& d)

又称为复制拷贝构造函数。

成都创新互联公司长期为千余家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为安阳县企业提供专业的成都网站制作、做网站,安阳县网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。

与拷贝构造函数要区分开。拷贝构造(初始化) 一个拷贝初始化另一个马上要创建的对象。赋值重载(复制拷贝) 已经存在两个对象之间拷贝。

Date d2(d1); // 拷贝构造(初始化)  一个拷贝并初始化另一个马上要创建的对象
//Date d2 = d1; // 拷贝构造 要看意义这个代码主要是初始化
Date d2;
d2 = d1; // 赋值重载(复制拷贝) 已经存在两个对象之间拷贝

举个反例

//如果是无返回值
void operator=(const Date& d)
//当遇到连续赋值d1 = d2 = d3;时就无法处理,因为d1是要靠d2来赋值的,所以赋值运算要有返回值。
//也可以返回d,但是对于赋值运算,我们要结合它的实际含义,要修改的是左操作数,故也要返回左操作数
---------------------
//返回值和传参都用引用!因为传值传参/返回都会进行一次拷贝构造,这个函数this出了作用域this指向的对象还在,就可以用引用返回。
//如果写成 Date operator=(const Date d)
//就会在形参创建时调用拷贝构造函数,在返回时也调用拷贝构造,这是不必要的系统开销。

注意:

1、赋值运算符只能重载成类的成员函数不能重载成全局函数;【如果在类外重载成全局函数时(意味着赋值运算符没有显式实现),那么编译器会生成一个默认的赋值重载函数。而这个时候类外已有一个全局的赋值运算符重载,就会和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符重载只能是类的成员函数。】

2、用户没有显式实现时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝。注意:内置类型成员变量是直接赋值的,而自定义类型成员变量需要调用对应类的赋值运算符重载完成赋值。

3、要注意自己给自己赋值的情况。标准赋值重载函数要单独判断这种情况,通过比较两个地址来判断。

什么时候需要自己写赋值重载函数?

在有资源开销的地方,比如stack类中,数组是malloc出来的。

int* _a;
int _top;
int _capacity;

两个对象st1(capacity=4)和st2(capacity=10),同理有st1.a和st2.a,当代码写成st1 = st2;时,如果用编译器默认生成的赋值重载函数进行值拷贝时,会出现两个a指向同一块地址空间,会导致对同一块空间free两次,且此时st2的capacity比st1的大,也出现了内存泄漏的问题。故解决方式是 不论两个对象原开辟的空间谁大谁小,都先释放掉原空间,再重新开辟。

总结:

构造函数和析构函数不会处理内置类型,会处理自定义类型;拷贝构造函数和赋值重载函数既会处理内置类型,也会处理自定义类型。

56取地址重载(运算符重载)

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

Date* operator&()
{
	return this;
}

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

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!

const成员

首先,先做个区分

//类成员函数的this指针的类型
void Print(Date* const this) {}
--------------------------
//假设有个类对象如下
const Date d1;
d1.Print();//err 此时调用就会报错
//因为这里的d1调用就会变成Print(&d1)==>d1的类型是const Date*,即const Date* pd1 = &d1;

//解释:比较一下Date* const this 和 const Date*,前者是保护指针内存的地址空间(对象可读可写),后者保护的是*this,即指针指向的对象d1  (对象只读)

上述这个情况应该怎么办?在成员函数定义结尾处加const。

void Print(Date* const this) const{}
//等价于void Print(const Date* const this) {}
--------------
Date d;
const Date d1;
d.Print(); // 权限的缩小
d1.Print(); // 权限的平移

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

在实际应用中,Date类的成员函数,如比较这一类的函数都应该加上const,+天数,-天数,对象-对象。

总结:凡是不改变*this对象数据的,都加上const。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:C++类和对象(二)-创新互联
转载注明:http://6mz.cn/article/dcdcsh.html

其他资讯