博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造函数细解
阅读量:5964 次
发布时间:2019-06-19

本文共 2025 字,大约阅读时间需要 6 分钟。

构造函数的目的在于初始化数据,并不鼓励调用默认构造函数(默认拷贝构造函数是浅拷贝,会有野指,且不是所有情况都会调用默认构造函数)

自己编写的构造函数大概分为

1、无参构造函数

2、有参构造函数

3、拷贝构造函数(复制构造函数)

还有一个

a、赋值函数(这个不算构造函数,容易与拷贝构造函数混淆)

#ifndef AREA_H#define AREA_H#include
using namespace std;//大项目不鼓励这么写,不然命名空间将失去作用,造成变量冲突class Area{public: Area(); //无参构造函数 Area(int len,int wid); //有参构造函数 Area(const Area &temp); //拷贝构造函数(复制构造函数) ~Area(); Area &operator= (const Area &other); //赋值函数 这个不是构造函数(有返回值)private: int length; int width;};#endif
#include "Area.h"#include 
using namespace std;Area::Area(){ length = 0; width = 0; cout << "调用无参构造函数" << endl;}Area::Area(int len,int wid){ length = len; width = wid; cout << "调用有参构造函数" << endl;}Area::Area(const Area &temp){ length = temp.length; width = temp.width; cout << "调用拷贝构造函数" << endl;}Area::~Area(){ cout << "调用析构函数" << endl;}Area& Area::operator= (const Area &other)//注意到这个是有返回值的{ length = other.length; width = other.width; cout << "调用赋值函数" << endl; return *this;}
#include "Area.h"#include
using namespace std;int main(){ Area a; //调用无参构造函数 Area b(2,3);//调用有参构造函数 Area c(b); //调用拷贝构造函数,复制初始化 Area d=b; //调用拷贝构造函数,赋值初始化 a = b; //调用赋值函数 return 0;}

下面为运行结果

 

下面讲一下深拷贝与浅拷贝:

浅拷贝(位拷贝):只考虑所有成员的值(如果堆分配空间,指针指向这个堆空间,那么浅拷贝就是简单赋值,俩个指针指向一块内存,一个释放,另外一个就是野指了)

深拷贝(值拷贝):复制引用对象本身(如果堆分配空间,指针指向这个堆空间,那么深拷贝会分配新的空间给新对象的指针变量)

举例说明:

class Area{public:    Area();                    //无参构造函数    Area(int len,int wid);  //有参构造函数    Area(const Area &temp);            //拷贝构造函数(复制构造函数)    ~Area();    Area &operator= (const Area &other);  //赋值函数  这个不是构造函数(有返回值)private:    int length;    int width;    int n_count;    int *n_ptr;};
Area::Area(const Area &temp){    n_count = temp.n_count;    n_ptr = temp.n_ptr;    cout << "调用浅拷贝构造函数" << endl;}
Area::Area(const Area &temp){    n_count = temp.n_count;    n_ptr = new int[n_count];    for(int i=0;i

 

转载于:https://www.cnblogs.com/effortscodepanda/p/6495515.html

你可能感兴趣的文章
苹果企业版帐号申请记录
查看>>
C++ Error: error LNK2019: unresolved external symbol
查看>>
Bitmap 和Drawable 的区别
查看>>
Java操作mongoDB2.6的常见API使用方法
查看>>
信息熵(Entropy)究竟是用来衡量什么的?
查看>>
如何给服务器设置邮件警报。
查看>>
iOS 数据库操作(使用FMDB)
查看>>
CEF js调用C#封装类含注释
查看>>
麦克劳林
查看>>
AOP概念
查看>>
jquery插件
查看>>
python time
查看>>
C#使用Advanced CSharp Messenger
查看>>
SharePoint Online 创建门户网站系列之首页布局
查看>>
SVN高速新手教程
查看>>
FSMC(STM32)
查看>>
ueditor样式过滤问题
查看>>
2015第36周日每天进步1%
查看>>
系统性能测试及调优--转载
查看>>
横向滚动条并且隐藏竖向滚动条
查看>>