复制构造函数

2023-11-10

和普通构造函数的区别:

普通构造函数在对象创建时被调用。
复制构造函数在用已有对象复制到一个新对象时被调用。
复制构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化。其形参必须是引用,但并不限制为const,一般普遍的会加上const限制。

何时调用

  1. 一个对象作为函数参数,以值传递的方式传入函数体;
  2. 一个对象作为函数返回值,以值传递的方式从函数返回;
  3. 一个对象用于给另外一个对象进行初始化(常称为赋值初始化);

如果在类中没有显式的声明一个拷贝构造函数,那么,编译器会自动生成一个来进行对象之间非static成员的位拷贝。
举例:
1、声明复制构造函数

#include <iostream>
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
    private:
      int a;
      int b;
    public:
      StringBad(const StringBad &s);// 声明复制构造函数
      StringBad();// 声明构造函数
      ~StringBad();
};
#endif

2、定义复制构造函数

StringBad::StringBad(const StringBad &s)
{
  a = s.a;
  b = s.b;
}

调用举例

1、函数参数为类的对象

void func(StringBad p) // 函数形参为类的对象
{
  cout << p.a;
}
int main()
{
  p(1,2);// 构造出对象p.
  func(p);// 将实参传递给形参完成一个拷贝,会调用复制构造函数
  return 0;
}

2、函数的返回值为类的对象时

StringBad func()
{
  StringBad s (1,2);
  return s;
}
int main()
{
  StringBad p = func();
  return 0;
}

3、对象赋值初始化

int main()
{
  StringBad p1(1,2); // 构造函数创建对象p1。
  StringBad p2(p1);//用对象p1 复制出对象p2(通过复制构造函数实现)
  return 0;
}

参考链接

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

复制构造函数 的相关文章

  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 获取没有非标准端口的原始 url (C#)

    第一个问题 环境 MVC C AppHarbor Problem 我正在调用 openid 提供商 并根据域生成绝对回调 url 在我的本地机器上 如果我点击的话 效果很好http localhost 12345 login Request
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • 目标检测中的标签分配策略

    介绍 label assignment 主要指的是检测器在训练阶段区分正负样本 并给feature map 不同位置匹配合适的监督目标 用于计算损失 进而完成梯度更新 合适的分配策略对于模型来说至关重要 在一定程度上决定了模型的性能 分类
  • ElementUI浅尝辄止17:Progress 进度条

    用于展示操作进度 告知用户当前状态和预期 常见于操作流程进度或某项任务的状态 1 如何使用 Progress 组件设置percentage属性即可 表示进度条对应的百分比 必填 必须在 0 100 通过 format 属性来指定进度条文字内
  • 图像分割-语义分割

    图像分割 语义分割 1 FCN 1 1 CNN与FCN的比较 1 2 三种上采样方法 1 2 1 双线性插值上采样 1 2 2 反卷积上采样 1 2 3 反池化上采样 1 3 FCN 跳层结构 Skip layer 1 4 FCN架构 1
  • 如何使用 AutoHotkey

    AutoHotkey 本身并不会做任何事情 你需要编写一个脚本来告诉它怎么做 所谓脚本就是一个以 ahk 为后缀的纯文本文件 里面包含了多个程序指令 就像配置文件一样 但是功能更加强大 一个脚本可以只是简单地执行一个动作后就退出 也可以定义
  • ClickHouse学习笔记(一):ClickHouse安装、数据类型、表引擎、SQL操作

    ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库 DBMS 使用C 语言编写 主要用于在线分析处理查询 OLAP 能够使用SQL查询实时生成分析数据报告 一 ClickHouse的特点 1 列式存储 以下面的表为例
  • 区块链倪老师:区块链行业的10种赚钱方式

    躁 是这个时代的特性 急于求成 成为了大部分人的真实写照 急功近利 这样的贬义词却更容易被奉为圭臬 区块链作为近些年广为人知的 风口 很多人压根不明白其究竟是怎么回事就急着 梭哈 尤其是在这个 躁 的时代 大部分人不求 知之甚深 只求 一夜
  • SpringBoot--基础--6.1--servlet的3大组件--Servlet

    SpringBoot 基础 6 1 servlet的3大组件 Servlet 代码位置 https gitee com DanShenGuiZu learnDemo tree mysql mybaties DB springboot lea
  • pip install conda之后出现问题

    本篇文章主要用于解决 在Linux环境下 在终端输入命令pip install conda之后出现异常报错 报错的结果粘贴如下 ERROR The install method you used for conda probably eit
  • C++11 新特性

    1 指针 智能指针 nullptr shared ptr std weak ptr 1 nullptr 作用 C 11 引入了 nullptr 关键字 专门用来区分空指针 0 原有问题 传统 C 会把 NULL 0 视为同一种东西 这取决于
  • 第二十三章、 Model/View便利类表格部件QTableWidget详解

    老猿Python博文目录 专栏 使用PyQt开发图形界面Python应用 老猿Python博客地址 一 引言 表格部件为应用程序提供标准的表格显示工具 在表格内可以管理基于行和列的数据项 表格中的最大数据项数为总行数和总列数的乘积 另外在表
  • ROC曲线与混淆矩阵的绘制

    20200813 引言 ROC曲线的绘制过程 混淆矩阵的绘制 问题 1 ROC曲线的绘制 ROC曲线的绘制绘制需要分类器能够返回相应的分类概率值 from sklearn metrics import roc curve ns fpr ns
  • Vue+SpringBoot使用POI导出EXCEL

    https blog csdn net qq 44209274 article details 110087085
  • shell命令基本操作1

    sed指定行插入 sed i i 或者 a 插入列paste 或者awk http bbs chinaunix net thread 342540 1 1 html shell定义函数func 函数体 shell算术运算 c a b htt
  • servlet-url-map

    import javax servlet ServletConfig import javax servlet ServletContext import javax servlet ServletException import java
  • Python学习笔记

    安装python 3 6 8 下载地址 cd usr local tar xzvf Python 3 6 8 tgz 带上ssl模块 一会pip会用 cd Python 3 6 8 configure with ssl 安装gcc编译器 y
  • Hibernate各种主键生成策略

    Hibernate各种主键生成策略详解 1 assigned lt 特点 可以跨数据库 人为控制主键生成 应尽量避免 gt 主键由外部程序负责生成 在 save 之前必须指定一个 Hibernate不负责维护主键生成 与Hibernate和
  • 队列的数组实现(C语言描述)

    队列也是一种简单却很有用的数据结构 其特点是先进先出 基本操作是enqueue 入列 和dequeue 出列 下面给出数组实现的代码 ifndef QUEUE H INCLUDED define QUEUE H INCLUDED struc
  • 使用jsonfield做注解名称值替换

    package cn superred support utils import cn hutool db meta Column import com alibaba fastjson annotation JSONField impor
  • tomcat的启动过程分析

    一 了解类加载器 要了解类加载器首先要了解什么是类加载机制 Java虚拟机把描述类的数据从Class文件加载进内存 并对数据进行校验 转换解析和初始化 最终形成可以呗虚拟机直接使用的Java类型 这就是虚拟机的类加载机制 虚拟机设计团队把类
  • 复制构造函数

    和普通构造函数的区别 普通构造函数在对象创建时被调用 复制构造函数在用已有对象复制到一个新对象时被调用 复制构造函数由编译器调用来完成一些基于同一类的其他对象的构建及初始化 其形参必须是引用 但并不限制为const 一般普遍的会加上cons