主要内容来源:https://www.bilibili.com/video/BV1et411b73Z?spm_id_from=333.999.0.0

一、构造函数

构造函数的分类

1.按参数分:无参构造(默认)、有参构造

即构造函数有无参数
由于构造函数可以带有参数,因此构造函数也可以函数重载

#include<iostream>
#include<String>
using namespace std;class Person
{public:
//构造函数
Person() {cout<<"调用Person的无参构造函数"<<endl; }
Person():age(10) {cout<<"调用Person的无参构造函数"<<endl; } 后加冒号可给对象成员赋初值Person(int a) {cout<<"调用Person的有参构造函数"<<endl;}
Person(int a,int b) {cout<<"调用Person的有参构造函数"<<endl;}
private:
int age;
}int main()
{Person p;
p.Person(1,1);//将调用Person(int a,int b)
}

2.按类型分:普通构造、拷贝构造

class Person
{public:
//构造函数
Person() {cout<<"调用Person的无参构造函数"<<endl; }
Person(int a) {cout<<"调用Person的有参构造函数"<<endl;}
//拷贝构造函数
Person(const Person &p) //固定格式,将传入的对象p的所有属性,拷贝到我身上。
{age = p.age;
}
private:
int age;
}

构造函数的调用方式

1.括号法

#include<iostream>
#include<String>
using namespace std;class Person
{public:
//构造函数
Person() {cout<<"调用Person的无参构造函数"<<endl; }
Person(int a) {cout<<"调用Person的有参构造函数"<<endl;}
Person(const Person &p) {age = p.age;}
private:
int age;
}
//********************构造函数调用**************************************//
void func()
{Person p1;//默认构造函数调用,即创建对象时会默认调用
Person p2(10);//创建对象时调用有参构造函数
Person p3(p2);//创建对象时调用拷贝构造函数,将已创建的对象p2拷贝。
}int main()
{func();
return 0;
}

注意事项

调用默认构造函数的时候,不要加括号。
如Person p;不能写成 Person p();
编译器会把 Person p()当成一个函数声明(返回值类型为Person,函数名为p)

2.显示法

.......
void func()
{Person p1;//用显示法调用默认构造函数
Person p2 = Person(10);//用显示法调用有参构造函数
Person p3 = Person(p2);//用显示法调用拷贝构造函数//*************注意************//
Person(10);//此为匿名对象,当前行执行完毕后,系统会立即回收掉匿名对象。//因为没有名称,后续也无法调用此对象,所以其没有意义,故要被系统回收。
}

注意事项

不要利用拷贝构造函数初始化匿名对象
如 Person(p2); 编译器会认为Person(p2)等价于Person p3,造成重命名的错误

3.隐式转换法

void func()
{Person p2 = 10;//用隐式转换法调用有参构造函数。相当于 Person p2 = Person(10);
Person p3 = p2;//用隐式转换法调用拷贝构造函数。相当于 Person p3 = Person(p2);
}

二、构造函数调用规则


只要自己定义了拷贝构造函数,就必须也要定义构造函数。

三、浅拷贝与深拷贝

#include...
class Person
{Person(int m_age,int m_height)
{age = m_age,height = new int(m_height);
}//调用有参构造,其中m_height在堆区开辟,需要手动删除
~Person()
{if(height != NULL)
{ delete height;  height = NULL;}
}//调用析构函数,删除堆区的数据
int age;
int * height;
}
int main()
{Person p1(18,180);Person p2(p1);//浅拷贝return 0;
}

上述代码无法运行
浅拷贝是简单的赋值操作,会将p1的age,height直接拷贝给p2,age没有问题,但height是指针,这样p1和p2中的height都会指向堆区中的180,这样在执行析构函数时,会执行两遍delete height命令,这是违规操作。原因就是默认的拷贝构造函数是浅拷贝,只是进行简单的赋值操作。

此时需要自己编写拷贝构造函数,进行深拷贝。

#include...
class Person
{Person(int m_age,int m_height)
{age = m_age,height = new int(m_height);
}//调用有参构造,其中m_height在堆区开辟,需要手动删除
Person(const Person & p)
{age = p.age;height = new int (*p.height);//在堆区重新开辟一个空间,存储自己的值。
}//调用拷贝构造函数,进行深拷贝。
~Person()
{if(height != NULL)
{ delete height;  height = NULL;}
}//调用析构函数,删除堆区的数据
int age;
int * height;
}
int main()
{Person p1(18,180);Person p2(p1);//浅拷贝return 0;
}

总结

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

C++学习笔记【类和对象】【构造函数和析构函数】相关推荐

  1. Java 入门知识学习笔记 (类和对象)

    一.类和对象的定义及关系 1.类是同一类别对象的抽象定义:可以理解为是某一类具体对象的模子,确定对象将会拥有的特性,包括该类对象具备的属性和方法. 2.对象是对类的一种具体化的客观存在,是对类的具体实 ...

  2. (JAVA学习笔记) 类与对象小结

    1.类与对象 类是一个抽象的模板: 对象是类的一个具体的实例: 2.方法 方法的定义:修饰符,返回类型,方法名,参数列表,异常抛出,返回值. 方法的调用:静态方法,非静态方法,形参和实参,值传递和引用 ...

  3. java学习笔记-类与对象示例

    类与对象 环境 类和对象的概念 代码格式 实例化对象 调用方法 小游戏:王者solo赛 问题:如果有100个英雄呢? 继承 概念 格式 具体内容 子类可以继承到父类的哪些 方法重写: 自动转型: 优点 ...

  4. Kotlin学习笔记——类和对象

    推荐kotlin学习书籍 下载链接: https://pan.baidu.com/s/19b5WYDD3Yqh1CAsRvpUsqQ 提取码获取方式:扫描关注下面微信公众号,回复关键字: kotlin ...

  5. C#.NET学习笔记 -类,接口,对象

    在开始谈接口和类的总结之前,先来了解接口和类的基本概念.熟悉了概念再来看代码就容易理解些. 先来看类的概念:什么是类? 类是面向对象程序设计的核心,实际上是一种复杂的数据类型.将不同类型的数据和与这些 ...

  6. Objective-C学习笔记---构造函数和析构函数

    简单的讲,构造函数就是在创建一个对象的时候起到初始化的作用,对这个对象里的一些成员变量进行初始化,析构函数就是在对象被删除进行一些清理工作,也就是专门的扫尾工作,下面用代码来进行具体说明. 一.构造函 ...

  7. JavaScript:学习笔记(9)——Promise对象

    JavaScript:学习笔记(9)--Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...

  8. 传智博客学习笔记8--面向对象下

    传智博客学习笔记8--面向对象下 2009-3-12 15:41:42 继承 extends 接口 interface 如果一个抽象类中的所有方法都是抽象的,我们就可以将这个类用另外一种方式来定义,也 ...

  9. jmh学习笔记-State共享对象

    系列文章目录 jmh学习笔记-源代码编译与bench mode jmh学习笔记-State共享对象 jmh学习笔记-State共享对象前后置方法 jmh学习笔记-代码清除 jmh学习笔记-常量折叠 j ...

  10. python学习笔记4(对象/引用;多范式; 上下文管理器)

    python学习笔记4(对象/引用:多范式; 上下文管理器) ### Python的强大很大一部分原因在于,它提供有很多已经写好的,可以现成用的对象 21. 动态类型:对象/引用 对象和引用: 对象是 ...

最新文章

  1. sftp连不上服务器 vscode_VSCODE 【SFTP】 Code:3221225477 / 扩展宿主意外终止 解决方法...
  2. c语言实验报告世界时钟,基于LCD的电子时钟实验报告.doc
  3. 斯坦福大学统计系教授带你玩转微生物组分析
  4. 年薪 37 万+,挪威科技大学(NTNU)招募博士,利用 ML 和 AI 进行钢桥结构健康监测和损伤检测...
  5. 单片机语音库文件_20天备战智能车之NXP库使用教程逐飞科技
  6. mysql5.7.6允许远程_mysql5.7 设置远程访问
  7. 暴雨公式 matlab,对雨水暴雨强度公式中降雨历时分解.pdf
  8. 十字链表实现稀疏矩阵,包含十二大功能
  9. 可以拍c语言答案的软件下载,c语言二级考试题库app下载-C语言二级考试题库 安卓版v2.3-PC6安卓网...
  10. 彼得林奇PEG价值选股策略(附源码入口)
  11. c语言实验报告总结通用版,C语言实训心得体会
  12. 基于PHP的华为手机商城系统(完整前后台)
  13. [UVA 202]Repeating Decimals
  14. ssh导出数据库的数据到Excel表格
  15. 宇视录像机多种协议添加摄像机(只介绍常用的宇视、onvif、GB28181三种协议)
  16. linux编写守护进程
  17. C++实现求最大访客数
  18. 7. print的应用(3):格式化输出之format模式
  19. Spring Boot 下 zookeeper搭配dubbo 服务注册与发现 搭建
  20. 分享一个小白也能月入2万有趣又高薪的心理兼职

热门文章

  1. 计算机考博士图书全总结
  2. Java程序设计基础项目总结报告
  3. 《挑战程序设计竞赛》学习笔记(二):穷竭搜索
  4. [从头学数学] 第180节 解三角形
  5. 知识图谱在畜牧业中的应用实例
  6. 众昂矿业:2022年全球萤石行业市场供给现状分析
  7. android linearlayout 自动滚动,Android开发,LinearLayout无法滚动问题
  8. 无线wifi突然网速慢可能的原因--频段冲突
  9. 天玑1200来了,2021年旗舰手机迎体验新趋势
  10. 中石油测井-技术研发岗回顾