设为首页 加入收藏

TOP

C++ 拷贝构造函数 赋值函数调用
2014-11-23 22:06:51 来源: 作者: 【 】 浏览:20
Tags:拷贝 构造 函数 调用

类定义中,如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。


C++提供的默认拷贝构造函数工作的方法是:完成一个成员一个成员的拷贝,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。


而拷贝构造函数和赋值运算符则是C++独有的,也是很多人所不熟悉的地方。构造函数和拷贝构造函数用于从一个对象复制出另一个对象。系统提供的默认拷贝构造函数和赋值运算的工作方式是内存拷贝,也就是浅拷贝。如果对象中用到了需要手动释放的对象,则会出现问题,这时就要手动重载这两个函数,实现深拷贝。


C语言梳理一下,分布在以下10个章节中:


考虑如下情况:


#include >
#include >
struct Node{
Node(){}
~Node(){delete p;}
int * p;
};
int main()
{
std::vectorv;
Node n1;
n1.p = new int[2];
v.push_back(n1);//会有拷贝发生 , 在程序结束时将发生两次析构 程序在结束时崩溃
}


什么时候调用拷贝构造函数、什么时候调用赋值函数(=号操作符)


1. A a2(a1); 这个很明显调用的是拷贝构造函数


2. a3 = a2 这个很明显调用的是赋值运算


3. A a3 = a1; 这个就没其它几个那么好懂了,看起来即像是调用拷贝构造函数创建一个对象,又像是调用赋值运算复制一个对象,还是两个都调了?实际上,这个调用的是拷贝构造函数,和第二行的方式是等价的。


对于第三行的 A a3 = a1;这种方式,我们如何去理解它呢?实际上有一个很好记的统一的大原则:从无到有是调用构造函数,从有到有调用的是赋值运算。基于这个原则,前面四行代码哪个是调用哪个函数就很好区分了。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenGL 4.0 GLSL 基础教程概览 下一篇C++ 中 const 常量函数 static 变..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: