不要轻视拷贝构造函数与赋值函数

时间:2019-05-12 20:35:57下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《不要轻视拷贝构造函数与赋值函数》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《不要轻视拷贝构造函数与赋值函数》。

第一篇:不要轻视拷贝构造函数与赋值函数

不要轻视拷贝构造函数与赋值函数

由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:

 本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。

现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。这将造成三个错误:一是b.m_data原有的内存没被释放,造成内存泄露;二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;三是在对象被析构时,m_data被释放了两次。

 拷贝构造函数和赋值函数非常容易混淆,常导致错写 错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋值函数吗? Stringa(“hello”);

Stringb(“world”);

Stringc = a;// 调用了拷贝构造函数,最好写成 c(a);

c = b;// 调用了赋值函数

本例中第三个语句的风格较差,宜改写成String c(a)以区别于第四个语句。

第二篇:拷贝构造函数和赋值函数的区别

拷贝构造函数和赋值函数的区别

一个类会默认生成它的string()//默认普通构造函数

void string(const string &a)//默认拷贝构造函数,如果自己不实现,会用这个默认的//采用“位拷贝”的方式,对有成员指针的情况,一定有

//问 题, 因为“位拷贝”,指向同一地址空间,自己//实现,改成“值拷贝”

~stirng()//默认析构函数

const string& operation=(const string &a)//默认赋值函数,如果自己不实现,//默认的也是采用“位拷贝”的方式

“位拷贝”,string a(b);

除了a,b对象的地址不一样,但a,b成员对象都指向的同一地址空间。如果delete a, 就会删掉b的内容,所以位拷贝,对有指针成员变量的类,非常危险

拷贝构造函数发生的例子:

Aa(1);//调用构造函数,Ab(a);//调用拷贝构造函数

Ac=a;//第一次赋值,因为对象还没初始化,还是调用拷贝构造函数,c=b;//已经初始化的对象才能调用赋值函数

voidf(Aa);//函数声明

f(c);//实参传递时调用拷贝构造函数,但是编译器会根据具体情况把这个过程优化掉

总结:

1.拷贝构造函数只有在定义一个新的类对象并且用已有的对象进行初始化时调用.2.赋值函数只有在已经初始化(对象已定义)的情况下被调用

例如有一个类叫做‘myclass',并有一个实例:b

那么,myclassa=b;//拷贝构造函数

myclassa;

a=b;//赋值

两者调用的时间不一样,第一种情况下,a此时还没有被分配空间,在扶植的同时还要生成资源;

第二种情况下,a一构造完成,已经有了资源,所以此时等号只进行赋值。

第三篇:拷贝构造函数剖析

拷贝构造函数剖析

在讲课过程中,我发现大部分学生对拷贝构造函数的理解不够深入,不明白自定义拷贝构造函数的必要性。因此,我将这部分内容,进行了总结。

拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。功能:使用一个已经存在的对象始初化同类的一个新对象。这样得到对象和原来的对象具有完全相同的数据成员,即相同的属性。

拷贝构造函数的函数原型:

A(const A& other){ … … }

拷贝构造函数的应用场合:

当用类的一个对象去初始化该类的另一个对象时;若函数的形参为类对象,调用函数时,实参赋值给形参;当函数的返回值是类对象时。比如:

A a1(10);

A a2 = a1;

A a3(a1);// 构造函数 // 拷贝构造函数 // 拷贝构造函数

默认拷贝构造函数:成员变量之间的“值”拷贝

编写拷贝构造函数的必要性

class A

{

public:

A(const char* data)

{

name = new char[strlen(data)+ 1];

strcpy(name, data);

}

A(const A& other)

{

name = new char[strlen(other.name)+ 1];

strcpy(name, other.name);

}

private:

char* name;

};

考察:char* data = “abcd”;A a1(data);A a2 = a1;

如果未定义拷贝构造函数,会有何种后果?

现将a1赋给a2,缺省拷贝构造函数的“位拷贝”意味着执行a2.name = a1.name。这将造成二个错误:一是a2.name和a1.name指向同一块内存,任何一方变动都会影响另一方;二是在对象被析构时,name被释放了两次。

第四篇:偷懒的办法处理拷贝构造函数与赋值函数

偷懒的办法处理拷贝构造函数与赋值函数

如果我们实在不想编写拷贝构造函数和赋值函数,又不允许别人使用编译器生成的缺省函数,怎么办?

偷懒的办法是:只需将拷贝构造函数和赋值函数声明为私有函数,不用编写代码。例如:

class A

{ …

private:

A(const A &a);// 私有的拷贝构造函数

A & operate =(const A &a);// 私有的赋值函数

};

如果有人试图编写如下程序:

Ab(a);// 调用了私有的拷贝构造函数

b = a;// 调用了私有的赋值函数

编译器将指出错误,因为外界不可以操作A的私有函数。

第五篇:类的构造函数 析构函数与赋值函数

类的构造函数 析构函数与赋值函数

构造函数 析构函数与赋值函数是每个类最基本的函数。它们太普通以致让人容易麻痹大意,其实这些貌似简单的函数就象没有顶盖的下水道那样危险。

每个类只有一个析构函数和一个赋值函数,但可以有多个构造函数(包含一个拷贝构造函数,其它的称为普通构造函数)。对于任意一个类A,如果不想编写上述函数,C++编译器将自动为A产生四个缺省的函数,如

A(void);// 缺省的无参数构造函数

A(const A &a);// 缺省的拷贝构造函数

~A(void);// 缺省的析构函数

A & operate =(const A &a);// 缺省的赋值函数

这不禁让人疑惑,既然能自动生成函数,为什么还要程序员编写?

原因如下:

(1)如果使用“缺省的无参数构造函数”和“缺省的析构函数”,等于放弃了自主“初始化”和“清除”的机会,C++发明人Stroustrup的好心好意白费了。

(2)“缺省的拷贝构造函数”和“缺省的赋值函数”均采用“位拷贝”而非“值拷贝”的方式来实现,倘若类中含有指针变量,这两个函数注定将出错。

对于那些没有吃够苦头的C++程序员,如果他说编写构造函数 析构函数与赋值函数很容易,可以不用动脑筋,表明他的认识还比较肤浅,水平有待于提高。

本章以类String的设计与实现为例,深入阐述被很多教科书忽视了的道理。String的结构如下:

class String

{

public:

String(const char *str = NULL);// 普通构造函数

String(const String &other);// 拷贝构造函数

~ String(void);// 析构函数

String & operate =(const String &other);// 赋值函数private:

char*m_data;// 用于保存字符串

};

下载不要轻视拷贝构造函数与赋值函数word格式文档
下载不要轻视拷贝构造函数与赋值函数.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    构造函数

    构造函数 1.设 f(x) ,g(x)分别为定义在R上的奇函数和偶函数,当x0时, f(x)g(x)f(x)g(x)0,且g(3)0,则不等式f(x)g(x)0的解集为______. 2.设f(x)是定义在R上的奇函数,且f(2)0,当x0时,有......

    构造函数法

    函数与方程数学思想方法是新课标要求的一种重要的数学思想方法,构造函数法便是其中的一种。 高等数学中两个重要极限 1.limsinx1 x0x 11x2.lim(1)e(变形lim(1x)xe) x0xx 由以上两......

    构造函数法与放缩法

    构造函数法证明不等式不等式证明是中学数学的重要内容之一.由于证明不等式没有固定的模式,证法灵活多样,技巧性强,使其成为各种考试命题的热点问题,函数法证明不等式就是其常见题......

    拷贝构造函数的参数类型必须是引用

    拷贝构造函数的参数类型必须是引用 在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。 但是如果我问你“拷贝构造函数的参数......

    构造函数证明不等式

    在含有两个或两个以上字母的不等式中,若使用其它方法不能解决,可将一边整理为零,而另一边为某个字母的二次式,这时可考虑用判别式法。一般对与一元二次函数有关或能通过等价转化......

    构造函数解导数

    合理构造函数解导数问题 构造函数是解导数问题的基本方法,但是有时简单的构造函数对问题求解带来很大麻烦甚至是解决不了问题的,那么怎样合理的构造函数就是问题的关键。 例1:......

    构造函数证明不等式

    构造函数证明不等式构造函数证明:>e的(4n-4)/6n+3)次方不等式两边取自然对数(严格递增)有:ln(2^2/2^2-1)+ln(3^2/3^2-1)+...+ln(n^2/n^2-1)>(4n-4)/(6n+3)不等式左边=2ln2-l......

    构造法之构造函数

    构造法之构造函数:题设条件多元-构造一次函数B:题设有相似结构-构造同结构函数主要介绍C:题设条件满足三角特性-构造三角函数 D:其它方面——参考构造函数解不等式A、题设条件多......