构造函数和析构函数

对象的初始化和清理是两个非常重要的安全问题

一个对象或变量没有初始状态,对其使用后果是未知的

使用完一个对象或变量,没有及时清理,也会造成一定的安全问题

C++利用构造函数和析构函数解决上述问题,这两个函数会被编译器自动调用,完成对象的初始化和清理操作。

对象的初始化和清理是编译器强制要我们做的事情,因此如果我们不提供构造和析构函数,编译器会提供(编译器提供的构造和析构函数是空实现

语法

构造函数语法: 类名(){}

1.没有返回值,也不写void

2.函数名称与类名相同

3.构造函数可以有参数,因此可以发生重载

4.程序在调用对象时候会自动调用构造,无需手动调用,而且只会调用一次

析构函数:~类名(){}

1.没有返回值,也不写void

2.函数名称与类名相同,在名称前加上符号~

3.构造函数不可以有参数,因此不可以发生重载

4.程序在对象销毁前会自动调用析构,无需手动调用,而且只会调用一次

(感觉这部分内容了解一下就行

C++ 类构造函数 & 析构函数 | 菜鸟教程 (runoob.com)

C++ 拷贝构造函数 | 菜鸟教程 (runoob.com)

构造函数的分类及调用

按照是否传入参数分类,分为无参构造(默认构造)和有参构造

按照类型               分类,分为普通构造                     和拷贝构造

拷贝调用时机

1.使用一个已经创建完毕的对象来初始化一个新对象

void test01()
{person  p1(20);person  p2(p1);
}

2.值传递的方式给函数参数传值

void dowork(person p)
{}
void test02()
{person  p;//默认构造dowork(p);//拷贝构造
}

3.值方式返回局部对象

person dowork2()
{person p1;//默认构造return p1;//拷贝构造
}
void test03()
{person p=dowork2();
}

构造函数调用规则

1.创建一个类,C++编译器会给每个类都添加至少3个函数

默认构造  (空实现

析构函数  (空实现

拷贝构造  (值拷贝

2.如果我们写了有参构造函数,编译器就不再提供默认构造,但会提供拷贝构造函数。

如果我们写了拷贝构造函数,编译器就不再提供其他的普通构造函数。

(级别:拷贝>有参>默认)

深拷贝与浅拷贝

浅拷贝:编译器提供的都是浅拷贝。简单的赋值也是浅拷贝

深拷贝:在堆区重新申请空间,进行拷贝操作

malloc  /   new    的东西在堆区,堆区的数据要手动开辟,手动释放

浅拷贝带来的问题

用new把数据创建在堆区,并用指针去接收

int *m_height;
m_height=new int (height);
~person()//析构函数,将堆区元素释放
{if (m_height != NULL){delete m_hight;m_hight = NULL;}
}

这里会出现bug!!

浅拷贝带来了问题:堆区操作被重复释放

利用深拷贝解决

重新在堆区申请内存,也就是让P1指向一块堆区,P2也指向一块堆区。

自己实现一个拷贝构造函数,解决浅拷贝带来的问题

person(const person &p)
{//m_height = p.m_height;   编译器默认构造函数m_height=new int(*p.m_height);
}

如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题。

初始化列表

C++提供了初始化列表语法,用来初始化属性。

语法:构造函数():属性1(值1),属性2(值2)…{}

传统初始化操作

person(int a, int b, int c){m_A = a;m_B = b;m_C = c;}

初始化列表初始化属性

person() :m_A(10), m_B(20), m_C(30){}
person(int a,int b,int c) :m_A(a), m_B(b), m_C(c){}

类对象作为类的成员

C++类中的成员可以是另一个类的对象,我们称该对象为对象成员。

class A{};
class B
{A a;};
#include<iostream>
#include<string>
using namespace std;class phone
{
public:phone(string pname){m_pname = pname;}string m_pname;};
class person
{
public:person(string name, string pname):m_name(name),m_phone(pname){}string m_name;phone m_phone;};
int main()
{person p("张三", "apple");system("pause");return 0;
}

这种情况下会先构造phone类,才会构造person类

当其他类对象作为本类成员,构造时先构造类对象,再构造自身,析构的顺序与构造的顺序相反。

先构造phone,先析构person

【C++学习】类和对象--对象特性(1)相关推荐

  1. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  2. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: 1 class Counter{ 2 private var va ...

  3. java学习---类与对象

    java学习心得3 文章目录 java学习心得3 类 对象 关键字this 总结与反思 类 一 定义一个Java的类 属性 : 将数据存储在变量中 1成员变量 使用成员变量:对象名.变量名 使用成员方 ...

  4. java学习--类与对象

    文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...

  5. 类和对象的特性(C++谭浩强第三版笔记)

    0.0 从程序结构上看:   基于过程的程序中:围绕功能进行的,函数是构成程序的基本部分,程序面对的是一个个函数.   面向对象的程序中:除主函数外,其他函数基本上都出现在"类"中 ...

  6. 学习集合工具类CollectionUtils——List对象案例

    学习集合工具类CollectionUtils--List对象案例 一.依赖 二.案例 三.结果展示 一.依赖 <dependency><groupId>org.apache.c ...

  7. C++入门学习 类与对象

    类与对象 普通大一新生,C++入门.老师上课不讲课只看视频讲解,效率低.临近期末总结巩固已经学习过的内容. 一.构造函数 定义 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数-> ...

  8. Python编程语言学习:python语言中快速查询python自带模块函数的用法及其属性方法、如何查询某个函数关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略

    Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法.如何查询某个函数&关键词的用法.输出一个类或者实例化对象的所有属性和方法名之详细攻略 ...

  9. Java学习 --- 类与对象

    目录 一.问题需求 二.类与对象关系图 三.类与对象的关系 四.什么是类 五.什么是对象 六.对象的内存分布图 一.问题需求 有两只猫,第一只叫小白,年龄:1岁,颜色:白色,第二只叫小黑,年龄:2岁, ...

  10. Java 学习 类与对象讲解

    类与对象的概念 : 什么是类 什么是对象 类与对象指的是一种编程思想,其中类是类别的概念,对象是这个类别中一个具体的个例 比如: 学生类对应 某一名具体的学生   计算机类 对应我正在使用的这台计算机 ...

最新文章

  1. angularjs 让当前路由重新加载_Spring Cloud Gateway的动态路由怎样做?集成Nacos实现很简单...
  2. DHCP详细配置实验总结
  3. 判断无向图是否有回路有四种方法
  4. 2018上半年信息安全工程师真题含答案(下午题)
  5. vs debug 调试 快捷键
  6. eth_type_trans的处理流程图
  7. 推荐两个Magento做的中文网站 GAP和佰草集
  8. datagridview输入数据格式化_第五节,输入输出函数
  9. 原生JS 将canvas生成图片
  10. bzoj1042硬币购物
  11. JavaWeb中的问题 ---- Servlet和Jsp
  12. keil4如何设置自动缩进_在Keil中 自动格式化 代码
  13. Android判断是否可以使用外网
  14. linux execl()函数
  15. 数据治理的时代演变之道:大数据分析与机器学习落地应用的未来
  16. php怎么切取部分歌曲,怎么把歌曲里的某一段剪切出来-歌曲怎么剪切,音频剪切软件...
  17. C# aspnetcore 完整修改项目名称
  18. 骑士周游(马走棋盘)及剪枝分析
  19. Nginx学习部署环境(一)
  20. MyBatis之通用mapper

热门文章

  1. 【原创】移动端底部漂浮代码
  2. 驱动人生深度扫描功能上线!使用感怎么样?
  3. 怎么用电脑把mkv格式转换成mp3格式
  4. Illustrator 教程:了解 Illustrator 中的效果
  5. 插入排序(Insertion Sort)-Java实现
  6. MSS代码解读-SRR_MSS_CLIInit(三)
  7. [Python-Excel](01)Excel列数据提取到TXT文件
  8. 计算机实训室日常管理制度,计算机系实训室管理规定
  9. 详解git pull命令和使用过程中遇到的常见问题:fatal: ‘origin‘ does not appear to be a git repository
  10. 推广app免填邀请码,替代Shareinstall和openinstall开发方案