C++总结笔记(五)——构造函数和析构函数

文章目录

  • 前言
  • 一、基本概念
    • 1 构造函数
    • 2 析构函数
  • 二、示例
    • 1. 构造函数和析构函数的简单使用
    • 2. 拷贝构造函数的调用
    • 3. 浅拷贝和深拷贝


前言

本文讲述了构造函数和析构函数的概念以及对应的示例,以便加深理解。


一、基本概念

1 构造函数

构造函数用于初始化类的对象,可以由程序员自己定义,也可以由编译器定义(构造函数内为空)。
其特点:
1.没有返回类型。
2.函数名和类名相同。
3.可以有参数,也可以没有。
4.可以重载。
5.程序会自动调用。
按照参数分类
1.无参构造函数
2.有参构造函数(包括拷贝构造函数)
3种构造方法
1.括号法
2.显示法
3.隐式转换法
调用规则
1.编译器会给类添加至少三个构造函数:1,默认构造函数;2,析构函数(空);3,拷贝构造函数(值拷贝):如果不写拷贝构造,编译器会自动生成一个拷贝构造函数,Name = c.Name;。
2.如果自己写了有参构造函数,编译器不会再提供默认构造函数,但还是会提供拷贝构造函数。
3.如果自己写了拷贝构造函数,编译器其他两种构造函数都不会再提供。

2 析构函数

析构函数用于销毁之前声明的类对象,系统自动调用,用~+类名声明。
1.析构函数不可以有参数。
2.析构函数无法重载。

二、示例

1. 构造函数和析构函数的简单使用

class Cat
{
public:Cat(){cout << "喵是无参构造函数" << endl;}Cat(string name){Name = name;cout << "喵是有参构造函数" << endl;}//用于拷贝c的属性值,用常量引用的方式进行Cat(const Cat &c){Name = c.Name;cout<< "喵是拷贝构造函数" << endl;}~Cat(){cout << "喵是析构函数" << endl;}string Name;//咪咪名字
};void FindName()
{//括号法Cat cat1;//用默认构造函数时,不能加括号,否则编译器会当作函数声明。Cat cat2(cat1);//拷贝构造函数调用Cat cat3("小300");//有参构造函数调用。Cat cat4(cat3);//拷贝构造函数调用cout << "第一个猫的名字是:" << cat1.Name << endl;cout << "第二个猫的名字是:" << cat2.Name << endl;cout << "第三个猫的名字是:" << cat3.Name << endl;cout << "第四个猫的名字是:" << cat4.Name << endl;//显示法Cat cat5;//默认构造函数Cat cat6 = Cat("三号楼");//有参构造函数调用。Cat cat7 = Cat(cat6);//拷贝构造函数调用Cat("蹭铁棍");//匿名对象,会直接调用构造函数和析构函数,再去执行后面的内容。//Cat(cat7);不要匿名初始化拷贝构造函数cout << "第五个猫的名字是:" << cat5.Name << endl;cout << "第六个猫的名字是:" << cat6.Name << endl;cout << "第七个猫的名字是:" << cat7.Name << endl;//隐式调用string name8 = "来两根";Cat cat8 = name8;cout << "第八个猫的名字是:" << cat8.Name << endl;
}int main()
{FindName();
}
喵是拷贝构造函数
喵是普通有参构造函数
喵是拷贝构造函数
第一个猫的名字是:
第二个猫的名字是:
第三个猫的名字是:小300
第四个猫的名字是:小300
喵是无参构造函数
喵是普通有参构造函数
喵是拷贝构造函数
喵是普通有参构造函数
喵是析构函数
第五个猫的名字是:
第六个猫的名字是:三号楼
第七个猫的名字是:三号楼
喵是普通有参构造函数
第八个猫的名字是:来两根
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数

2. 拷贝构造函数的调用

void eat1(Cat cat)
{cout << cat.Name << "吃猫粮" << endl;
}Cat eat2()
{Cat cat("炸糊的栗子");cout << cat.Name << "吃骨头" << endl;return cat;
}
void FindName()
{//使用一个已经创建的对象来初始化新的对象Cat cat1("小300");//有参构造函数调用。Cat cat2(cat1);//拷贝构造函数调用cout << "第一个猫的名字是:" << cat1.Name << endl;cout << "第二个猫的名字是:" << cat2.Name << endl;//值传递传值      Cat cat3("烤糊的栗子");eat1(cat3);cout << "第三个猫的名字是:" << cat3.Name << endl;//值方式返回局部对象Cat cat4 = eat2();cout << "第四个猫的名字是:" << cat4.Name << endl;
}
喵是普通有参构造函数
喵是拷贝构造函数
第一个猫的名字是:小300
第二个猫的名字是:小300
喵是普通有参构造函数
喵是拷贝构造函数
烤糊的栗子吃猫粮
喵是析构函数
第三个猫的名字是:烤糊的栗子
喵是普通有参构造函数
炸糊的栗子吃骨头
喵是拷贝构造函数
喵是析构函数
第四个猫的名字是:炸糊的栗子
喵是析构函数
喵是析构函数
喵是析构函数
喵是析构函数

3. 浅拷贝和深拷贝

深拷贝:在堆区开辟空间,完成拷贝。
浅拷贝:简单赋值拷贝的方式就属于浅拷贝,比如默认的拷贝构造函数。

class Cat
{
public:Cat(){cout << "喵是无参构造函数" << endl;}//Cat(string name)//{//	Name = name;//	cout << "喵是普通有参构造函数" << endl;//}Cat(string name, int age){Name = name;Age = new int(age);cout << "喵是普通有参构造函数" << endl;}Cat(const Cat &c){Name = c.Name;//深拷贝,用new将传入Age的地址解引用然后在堆区重新创建一个空间,与cat3所指向的新内存空间就不一样了,不会发生析构函数重复释放报错的问题。Age = new int(*c.Age);cout<< "喵是拷贝构造函数" << endl;}~Cat(){if (Age != NULL){delete Age;Age = NULL;}cout << "喵是析构函数" << endl;}string Name;//咪咪名字int *Age;//咪咪年龄
};void FindName()
{浅拷贝,仅发生值传递//Cat cat1("小300");//Cat cat2(cat1);////cout << "第一个猫的名字是:" << cat1.Name << endl;//cout << "第二个猫的名字是:" << cat2.Name << endl;//深拷贝,用new在内存中开辟新空间Cat cat3("小300",2);Cat cat4(cat3);cout << "第三个猫的名字是:" << cat3.Name << endl;cout << "第三个猫的年龄是:" << *cat3.Age << endl;cout << "第四个猫的名字是:" << cat4.Name << endl;cout << "第四个猫的年龄是:" << *cat4.Age << endl;
}int main()
{FindName();
}
喵是普通有参构造函数
喵是拷贝构造函数
第三个猫的名字是:小300
第三个猫的年龄是:2
第四个猫的名字是:小300
第四个猫的年龄是:2
喵是析构函数
喵是析构函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256141.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LINUX 更新

sudo apt-get dist-upgrade,更新所有的软件转载于:https://www.cnblogs.com/jackieron/p/5997805.html

python实战===如何优雅的打飞机

这是一个打飞机的游戏&#xff0c;结构如下&#xff1a; 其中images中包含的素材为 命名为alien.png 命名为ship.png 游戏效果运行是这样的&#xff1a; 敌军&#xff0c;也就是体型稍微大点的&#xff0c;在上方左右移动&#xff0c;并且有规律向下移动。我军目标&#xff0c;…

【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略

目录 1、下采样 Python自带函数 自定义函数 Python实现下采样 2、上采样 Python自带函数 自定义函数<

C++总结笔记(六)——友元

文章目录前言一、基本概念二、程序示例1.全局函数调用私有成员2. 外部类调用私有成员3. 外部类的成员函数调用私有成员总结前言 一、基本概念 友元是C中为了方便类外的类或者函数访问类内私有成员而定义的一种特殊语法&#xff0c;用friend关键字进行修饰。 二、程序示例 友…

Java默认类型,类型转换,常量与变量笔记

默认类型&#xff1a; 在java里整数默认是int类型&#xff0c;小数默认是double类型&#xff0c;单个字符默认是char类型&#xff0c;true、false自然默认的是boolean类型&#xff0c;字符串默认的是String类型。 变量和常量类型转换&#xff1a; 因为有默认类型&#xff0c;在…

【图像处理】——Python实现灰度特征提取

目录 1、灰度特征 2、Python代码 1、灰度特征 2、Python代码 import cv2 import numpy as npdef gray_features(img):hist = cv2.calcHist([img],[0],None,[256],[0,255])#得到全局直方图统计数据

C++总结笔记(七)—— 运算符重载

文章目录一、概念二、程序示例1. 加减乘除重载2. 赋值运算符重载3. 递增递减运算符重载4. 关系运算符重载5. 左移运算符重载6. 函数调用运算符重载一、概念 C中运算符重载是为了实现对象之间进行各种运算的特定语法&#xff0c;在某些特定的场合起到重要的作用&#xff0c;新建…

asp.net 加载xml到menu

XML File <?xml version"1.0" encoding"utf-8" ?> <Area iAreaID "0" cAreaName"城市"><Province iAreaID "1" cAreaName"北京市"/><Province iAreaID "2" cAreaName"上海…

前端lvs访问多台nginx代理服务时出现404错误的处理

前端lvs访问多台nginx代理服务时出现404错误的处理 环境描述&#xff1a;app --> lvs --> nginx --> server app访问页面购买流量页面(nginx服务器)代理到后端和服务器交互(多台server)刚开始访问没有问题&#xff0c;流量变大为了避免出现问题&#xff0c;nginx配置了…

使用numpy出现DeprecationWarning: The normed argument is ignored when density is provided. 解决方法忽略警告的方法

目录 1、从根本上进行解决 2、直接利用warning模块忽略警告 1、从根本上进行解决 “DeprecationWarning: The normed argument is ignored when density is provided. In future passing both will result in an error.” 这种一般是因为函数库或者是一些包package版本更新而…

iptables四个表与五个链间的处理关系

转载自&#xff1a;http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包过滤系统是一种功能强大的工具&#xff0c;可用于添加、编辑和除去规则&#xff0c;这些规则是在做信息包过滤决定时&#xff0c;防火墙所遵循和组成的规则。 这些规则存储在专…

C++总结笔记(八)—— 菱形继承

文章目录一、基本概念二、程序举例1. 虚继承2. 内在逻辑一、基本概念 菱形继承是指存在两个子类继承自同一个基类&#xff0c;同时有子类继承这两个子类。 二、程序举例 1. 虚继承 使用虚继承可以解决菱形继承资源浪费的问题&#xff0c;因为有两个子类继承基类&#xff0c…

Linux命令:mkdir

全称&#xff1a;make directories 用途&#xff1a;创建新目录 格式&#xff1a;mkdir [OPTION]... DIRECTORY... 类型&#xff1a;mkdir is hashed (/bin/mkdir) 说明&#xff1a; 创建文件目录&#xff0c;较常用的选项参数有两个&#xff1a; -m, --modeMODE&#xff1a;直…

InnoDB引擎与MyIASM的一点总结

InnoDB引擎&#xff1a; 提供了对数据库ACID事务的支持&#xff0c;并且实现了SQL标准的四种隔离级别 提供了行级锁和外键约束。 它的设计的目标是处理大容量数据库系统&#xff0c;用于缓冲数据和索引。 不支持FULLTEXT类型的数据&#xff0c;没有保存表的行数&#xff0c;当s…

C++总结笔记(九)—— 多态

文章目录一、多态是什么&#xff1f;二、使用步骤2.1. 静态多态2.1.1 函数重载2.1.2 模板2.2.动态多态2.2.1 示例2.2.2 原理分析总结一、多态是什么&#xff1f; 多态是面向对象的语言中都必须掌握的特性&#xff0c;其概念简单讲就是对同一种特性的方法有不同的实现功能&…

[转]c++类的构造函数详解

c构造函数的知识在各种c教材上已有介绍&#xff0c;不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法&#xff0c;故在此我根据自己的c编程经验总结了一下c中各种构造函数的特点&#xff0c;并附上例子&#xff0c;希望对初学者有所帮助。 c类的构造函数详解 …

结构体对齐问题

#pragma (1)typedef struct {};#pragma ()#pragma pack(1) 的意义是什么skypxl | 浏览 27771 次发布于2009-10-01 16:38最佳答案设置结构体的边界对齐为1个字节&#xff0c;也就是所有数据在内存中是连续存储的。比如你在C语言中定义下面这样的结构体&#xff1a;struct s {cha…

【机器学习】——纯Python建立BP模型

参考:https://blog.csdn.net/michael_f2008/article/details/103715699 https://developer.aliyun.com/article/614411 import pandas as pd import numpy as np import datetime from sklearn.utils import shuffle# 1.初始化参数 def initialize_parameters(n_x, n_h, n_y…

组件局域网中的无集线器、Windows XP、Windows 7、Windows 8的对等网

为什么要用对等网&#xff1f; 答&#xff1a;对等网采用分散管理的方式&#xff0c;网络中的每台计算机既作为客户机又可作为服务器来工作&#xff0c;每个用户都管理自己机器上的资源。 组建局域网中无集线器的对等网 组建局域网中Windows XP的对等网 组建局域网中Windows 7的…

datatable绑定comboBox显示数据[C#]

实现功能&#xff1a;datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法&#xff1a;    //dataSet 转 dataTable    1、生成datatable&#xff0c;并为combox绑定数据源&#xff1a;comboBox1.DataSource dt1;comboBox1.DisplayMember "用户编码"…