13.1.3

2024-04-11 10:32
文章标签 13.1

本文主要是介绍13.1.3,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

练习13.9

①析构函数是什么?

②合成析构函数完成什么工作?

③什么时候会生成合成析构函数?

解答:

①析构函数执行与构造函数相反的操作:构造函数初始化对象的非static数据成员,还可能做一些其他工作;析构函数释放对象使用的资源,并销毁对象的非static数据对象。

②其实就和析构函数完成的工作是一样的

③当一个类没有定义自己的析构函数的时候,编译器会为它定义一个合成析构函数。


练习13.10

当一个StrBlob对象销毁时会发生什么?一个StrBlobPtr对象销毁时呢?

解答:

这里可以参考析构函数完成什么工作。

在一个构造函数中,成员的初始化是在函数体执行之前完成的,且按照他们再类中出现的顺序进行初始化。再一个析构函数中,首先执行函数体,然后销毁成员。成员按照初始化顺序的逆序销毁。


练习13.11

在前面练习中的HasPtr类添加一个析构函数。

解答:

#include <iostream>
#include <string>using namespace std;class HasPtr{
public:HasPtr(const string &s = string()):ps(new string(s)), i(0){}//HasPtr(const HasPtr& ori):ps(new string(*(ori.ps))), i(ori.i){};HasPtr& operator=(const HasPtr& ori){ps = new string(*(ori.ps));i = ori.i;return *this;}~HasPtr(){ // 添加析构函数delete ps;}
//private:string *ps;int i;
};int main(){HasPtr a("test string");cout << a.ps << endl;cout << *(a.ps) << endl;HasPtr b;b = a;//HasPtr b(a);cout << b.ps << endl;cout << *(b.ps) << endl;
}

练习13.12

在下面的代码片段中会发生几次析构函数调用?

bool fcn(const Sales_data *trans, Sales_data accum){Sales_data item1(*trans), item2(accum);return item1.isbn() != item2.isbn();}

解答:

这里可以用一段代码进行替换,来更好的了解

include <iostream>using namespace std;class A{public:A():a(10){}~A(){cout << "~A()" <<endl;}int a;
};bool fcn(const A *trans, A accum){A item1(*trans), item2(accum);return item1.a != item2.a;
}int main(){A ori1;A ori2;ori2.a = 9;cout << "function begin" << endl;cout << fcn(&ori1, ori2) << endl;cout << "function end" << endl;
}

在begin和end之中有3次析构函数的调用。

这里分别是,

函数第二个参数复制的对象,函数体中构造的两个对象。

这里要注意,当指向一个对象的引用或指针离开作用域时,析构函数不会执行。


练习13.13

理解拷贝控制成员和构造函数的一个好方法是定义一个简单的类,该类定义这些成员,每个成员都打印出自己的名字:

struct X{X() {std::cout << "X()" << std::endl;}X(const X&) {std::cout << "X(const X&)"<<std::endl;}};

给X添加拷贝复制运算符和析构函数,并编写一个程序以不同方式使用X的对象:将它们作为非引用和引用参数传递;

动态分配它们;将它们存放于容器中;诸如此类。观察程序的输出,直到你确认理解了什么时候会使用拷贝控制成员,以及为什么会使用它们。

当你观察程序输出时,记住编译器可以略过拷贝构造函数的调用。

解答:

这道题的意思很明确,要对编译器的行为进行观察。

#include <iostream>
#include <string>
using namespace std;
struct X{
<span style="white-space:pre">	</span>X() { cout << "X()" << endl; }
<span style="white-space:pre">	</span>X(const X&) { cout << "X(const X&)" << endl; }
<span style="white-space:pre">	</span>X& operator=(const X&) { cout << "operator = ()" << endl; return *this; }
<span style="white-space:pre">	</span>~X() { cout << "~X()" << endl; }
};
int main()
{
<span style="white-space:pre">	</span>X x1;
<span style="white-space:pre">	</span>X x2(x1);
<span style="white-space:pre">	</span>X x3 = x1;
<span style="white-space:pre">	</span>X x4;
<span style="white-space:pre">	</span>x4 = x1;
}
结果表明:
当使用()或者= 进行初始化时,调用的是拷贝构造函数。
当且仅当,先声明X类,在进行拷贝,才调用重载的=运算。


这篇关于13.1.3的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/893826

相关文章

opensuse 13.1 virtualbox error:This parameter must be a string or Unicode object

这个问题是一个bug,解决方法之一是在zypper中使用uninstall virtualbox,zypper in virtualbox-qt ,virtualbox-dev* 在 yast中把自己当前的用户加入到virtualusers用户组中,relogin即可(或者重启)

XP单机版安装金蝶K3的13.1版本,金蝶K3Wise安装步骤,成功安装

在我们安装金蝶K3时往往会出现各种报错,主要是因为我们的Windows Xp操作系统是Ghost版本,或者是windows XP HOME或者是精简版,因此某些组件在系统里没有,导致我们安装金蝶K3时经常出错报错。本文章就是主要结合实际安装过程,总结了一些问题的解决办法。如果您按照本流程进行安装会比较流畅。 下载一个版本的Windows XP镜像,重装电脑。

13.1.k8s集群的七层代理-ingress资源(进阶知识)

目录 一、ingress概述 1.前言 2.问题 3.ingress资源 二、ingress-nginx是什么 三、ingress-nginx 实现原理 四、部署ingress-nginx 1.获取部署文件 ingress-nginx.yaml 2.部署ingress-nginx 3.检查部署是否成功 五、编写使用Ingress样例代码 1.Ingress资源对象yam

13.1.资源清单的管理工具-helm

目录 一、helm的介绍 1.helm的价值概述 2.helm的关键名词 二、安装部署helm 1.解压安装包并设置全局命令 2.添加命令补全 三、使用helm部署服务管理 1.使用helm创建chart 1.1创建工作目录  1.2.helm创建chart 2.响应式创建名称空间 3.安装chart到名称空间 4.使用helm命令查看名称空间下的资源 5.修改服务的版

13.1 Go 反射(Reflection)

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO系列: 记录博主学习GO语言的笔

C++唯一智能指针(make_unique/unique_ptr/reset/release/get/13.1)

使用make_unique获取一个智能指针,智能指针的类型是unique_ptr // a不是数组,小括号里的就是值std::unique_ptr<int> a = std::make_unique<int>(666);std::cout << *a << std::endl;std::cout << a << std::endl;std::cout << "--------------

13.1基于TCP的Socket网络通信及Demo

目录 一、服务器端 二、客户端 三、遇到连接不上的问题解决办法 四、加入等待超时处理 一、服务器端         在PC上运行,仅仅建立ServerSocket监听,并使用Socket获取输出流输出。该ServerSocket将会一直监听,等待客户端程序的连接。 //基于TCP的Socket网络通信例程 服务器端public class SimpleServer {publi

openSUSE 13.1安装配置日记

这学期刚开学的时候,在刚买的移动硬盘上安装了openSUSE。配置好系统后,本来想在第一周周末整理一下安装配置日记,但苦于 没有时间,就把事情拖到的这个周末,现在总算有时间整理了。 1、禁用官方源和DVD光盘源,启用中国大陆源 使用DVD光盘安装好openSUSE 13.1之后,软件安装源中默认存在一个名称为”openSUSE-13.1-1.10″的软件源,这个源的URL实际上是指

13.1 QQ邮箱

1. 邮箱发送 2. 准备工作 3. 整合SpringBoot 3.1 配置 依赖引入 <!-- 邮件服务--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency

吴恩达机器学习笔记:第 8 周-13 聚类(Clustering)13.1-13.2

目录 第 8 周 13、 聚类(Clustering)13.1 无监督学习:简介 第 8 周 13、 聚类(Clustering) 13.1 无监督学习:简介 在这个视频中,我将开始介绍聚类算法。这将是一个激动人心的时刻,因为这是我们学习的第一个非监督学习算法。我们将要让计算机学习无标签数据,而不是此前的标签数据。 那么,什么是非监督学习呢?在课程的一开始,我曾简单地介绍过