第一篇:拷贝构造函数和赋值函数的区别
拷贝构造函数和赋值函数的区别
一个类会默认生成它的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一构造完成,已经有了资源,所以此时等号只进行赋值。
第二篇:不要轻视拷贝构造函数与赋值函数
不要轻视拷贝构造函数与赋值函数
由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:
本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类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)以区别于第四个语句。
第三篇:拷贝构造函数剖析
拷贝构造函数剖析
在讲课过程中,我发现大部分学生对拷贝构造函数的理解不够深入,不明白自定义拷贝构造函数的必要性。因此,我将这部分内容,进行了总结。
拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。功能:使用一个已经存在的对象始初化同类的一个新对象。这样得到对象和原来的对象具有完全相同的数据成员,即相同的属性。
拷贝构造函数的函数原型:
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的私有函数。
第五篇:构造函数
构造函数
1.设
f(x),g(x)分别为定义在R上的奇函数和偶函数,当x0时,f(x)g(x)f(x)g(x)0,且g(3)0,则不等式f(x)g(x)0的解集为______.2.设f(x)是定义在R上的奇函数,且f(2)0,当x0时,有x
f(x)f(x)0
恒成立,则不等式x2f(x)0的解集为__________.3.已知函数f(x)是定义在R上的奇函数,且当x(,0)时,有x<0成立,若a30.3
b
f(x)+f(x)1
3f(3
0.3),blog3
f(log
3),c(log
9)f(log
9),则a、、c的大小关系为__________.f(x),则当a0
4.已知可导函数f(x)满足f(x)系为__________.时,f(a)与ea
f(0)的大小关
5.若函数f(x)对任意的xR都有f(x)
A.3f(ln2)2f(ln3)
f(x)
成立,则__________.B.3f(ln2)2f(ln3)
C.3f(ln2)2f(ln3)D.3f(ln2)与2f(ln3)的大小关系不确定
6.设f(x)是R上的奇函数,且f(1)0,当x0时,(x2
1)f(x)2xf(x)0,则不等式f(x)0的解集为__________.7.已知函数f(x)是定义在(0,)的非负可导函数,且满足x对任意正数a、b,若a
f(x)+f(x)0,B.af(b)bf(a)C.af(a)f(b)
D.bf(b)f(a),8.已知f(x)与g(x)都是定义在R上的函数,g(x)0,f(x)g(x)
f(x)ag(x),x
f(x)g(x)0
f(1)g(1)
f(1)g(1)
.在有穷数列
f(n)
(n1,2,,10)中,前kg(n)
项和
为
1516,则k=__________.