剑指01

01

拷贝构造函数

class A{
private:
    int value;
public:
    A(int n){ value = n; }
    A(A other){ value = other.value; }
    void Print() {cout<<value<<endl; }
};
int main(void)
{
    A a = 10;
    A b = a;
    b.Print();
    return 0;
}

该代码编译运行结果为编译错误,因为其拷贝构造函数会存在一个无限递归调用的错误。

拷贝构造函数A(A other)由于是值传递,在把形参复制到实参的过程中会调用拷贝构造函数,所以如果允许传值的话,就会在拷贝构造函数里面调用拷贝构造函数,造成无限递归调用。

C++的标准不允许复制构造函数传值参数,只能将构造函数修改为A(const A& other),也就是把传值参数改为常量引用。(注意:传指针也是不可以的,只能改为引用)。

例:

A object1 = 10;

A object2 = object1 ;

第二步相当于将object1当作参数传给object1.A(A other),也就是 A other = object1,但是other是未初始化的,所以势必又要用object1来初始化other,即把object1作为参数传递给other.A(A other),后面就是陷入无限递归调用的情形。

参考地址:https://blog.csdn.net/xiaoquantouer/article/details/70145348?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control

1.对于一个类X,如果一个构造函数的第一个参数是下列之一:
a) X&
b) const X&
c) volatile X&
d) const volatile X&
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数.

2.类中可以存在超过一个拷贝构造函数, 如果一个类中没有定义拷贝构造函数,那么编译器会自动产生一个默认的拷贝构造函数.
这个默认的参数可能为X::X(const X&)或X::X(X&),由编译器根据上下文决定选择哪一个.

默认拷贝构造函数的行为如下:
默认的拷贝构造函数执行的顺序与其他用户定义的构造函数相同,执行先父类后子类的构造.
拷贝构造函数对类中每一个数据成员执行成员拷贝(memberwise Copy)的动作.
a)如果数据成员为某一个类的实例,那么调用此类的拷贝构造函数.
b)如果数据成员是一个数组,对数组的每一个执行按位拷贝.
c)如果数据成员是一个数量,如int,double,那么调用系统内建的赋值运算符对其进行赋值.

深拷贝和浅拷贝

java

浅拷贝基础类型修改不影响,引用类型拷贝后还是指向同一个对象,实现Cloneable接口覆写clone()方法。

深拷贝对于引用类型会另外开辟空间,不与原对象一致,需要在引用类型的对象实现Cloneable接口覆写clone()方法。

c++

浅拷贝会把指针变量的地址复制; 深拷贝会重新开辟内存空间。

浅拷贝的时候注意重复释放空间,可能会释放空的内存地址导致错误。

运算符重载

返回值类型是否声明为该类型的引用,并在函数结束前返回实例自身的引用,如*this。因为只有返回一个引用才能做连续赋值操作,如str1=str2=str3。

是否将传入的参数设置成了常量引用,这样不仅可以减少一次拷贝构造函数的调用也能避免对传入参数的修改。

是否释放之前实例已有的内存。如何释放(手动、析构),别重复释放。

是否判断传入实例和自身是否是一个实例,若不判断就操作,在释放的时候就一起释放了。

CMyString& CMyString::operator = (const CMyString &str) {
	if (this != &str) {
		CMyString strTemp(str);
		char* pTemp = strTemp.m_pData;
		strTemp.m_pData = m_pData;
		m_pData = pTemp;
	}
}

判断是否自身,利用临时变量来存储当前实例之前指向的地址,在临时变量释放的时候释放该地址,减少new delete操作和可能的空间不足错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
未来社区的建设背景和需求分析出,随着智能经济、大数据、人工智能、物联网、区块链、云计算等技术的发展,社区服务正朝着数字化、智能化转型。社区服务渠道由分散向统一融合转变,服务内容由通用庞杂向个性化、服务导向转变。未来社区将构建数字化生态,实现数据在线、组织在线、服务在线、产品智能和决策智能,赋能企业创新,同时注重人才培养和科研平台建设。 规划设计方面,未来社区将基于居民需求,打造以服务为中心的社区管理模式。通过统一的服务平台和应用,实现服务内容的整合和优化,提供灵活多样的服务方式,如推送式、订阅式、热点式等。社区将构建数据与应用的良性循环,提高服务效率,同时注重生态优美、绿色低碳、社会和谐,以实现幸福民生和产业发展。 建设运营上,未来社区强调科学规划、以人为本,创新引领、重点突破,统筹推进、整体提升。通过实施院落+社团自治工程,转变政府职能,深化社区自治法制化、信息化,解决社区治理中的重点问题。目标是培养有活力的社会组织,提高社区居民参与度和满意度,实现社区治理服务的制度机制创新。 未来社区的数字化解决方案包括信息发布系统、服务系统和管理系统。信息发布系统涵盖公共服务类和社会化服务类信息,提供政策宣传、家政服务、健康医疗咨询等功能。服务系统功能需求包括办事南、公共服务、社区工作参与互动等,旨在提高社区服务能力。管理系统功能需求则涉及院落管理、社团管理、社工队伍管理等,以实现社区治理的现代化。 最后,未来社区建设注重整合政府、社会组织、企业等多方资源,以提高社区服务的效率和质量。通过建立社区管理服务综合信息平台,提供社区公共服务、社区社会组织管理服务和社区便民服务,实现管理精简、高效、透明,服务快速、便捷。同时,通过培育和发展社区协会、社团等组织,激发社会化组织活力,为居民提供综合性的咨询和服务,促进社区的和谐发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值