关于拷贝构造函数和运算符重载的问题
Posted songyuchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于拷贝构造函数和运算符重载的问题相关的知识,希望对你有一定的参考价值。
各位,最近看了单例模式,里面为了防止单例模式初始化,于是将复制构造函数和重载运算符接口函数全部封掉了。那么这里就有一个问题:到底什么是复制构造函数?什么是运算符重载函数呢?今天查了一些资料,做了一些总结。
一、拷贝构造函数的缺点
二、复制构造函数的结构
三、运算符重载函数的结构
四、总结
一、拷贝构造函数的缺点
我们首先要复习一下拷贝构造函数。所谓拷贝构造函数,它的目标就是为了复制一些值给新的对象中,比如:
CExample(int b)
{a = b}
主函数当中调用:
CExample B = A
OK,那么现在我提出一个需求,我们不传递参数了,我们来传递类,那么我们就可以将其改成如下形式。
假如我们目前有一个类:
class Test
{
};
那么如果我们要写拷贝构造函数应该怎么写呢?
CExample(Test b)
{
}
主函数当中调用
CExample b = a;
OK,如果你这么写,恭喜你就写错了,因为这样做导致的结果就是会一直调拷贝构造函数,一直到栈溢出。这里要说明的是,他不是再运行当中出现问题,而是再编译当中就报错了,估计可能是编译器的设置有所不同吧。
也就是说,关于类之间传递的拷贝构造函数我们要重新进行思考和设计。
而关于类之间传递的拷贝构造函数我们可以分成两个部分:第一种就是再创建的时候就用进行拷贝构造,第二种就是再中间的时候进行拷贝构造。
第一种举例:CExample b = a;
第二种举例:CExample b;
b = a;
好的,那么关于复制构造函数和运算符函数重载就是针对这两个问题来进行设计的。
二、关于复制构造函数
复制构造函数时专门为了初始化时候传递类来进行设置的,它的设计就是再内部参数当中加上引用即可。即:
CExample(Test &b)
{
}
三、关于运算符重载函数的结构
运算符重载函数是撞门为了到中间的部分传递类来进行设置的,它的设计结构。以上面的为例
CExample CExample::operator = (const &CExample c)
{
}
四、总结
总结一下,复制构造函数和运算符重载函数的共同点在于都是用在类的实例化对象进行传递,不同点在于复制构造函数用来再类的初始化的时候进行调用,运算符重载函数是专门为了到中间时来进行调用。
以上是关于关于拷贝构造函数和运算符重载的问题的主要内容,如果未能解决你的问题,请参考以下文章