构造函数及复制构造函数

2023-10-31

一、构造函数

是为了让我们自己去规定 , 我们定义对象的初始化。
这里给出一段程序,作用是按格式输出 输入的时间。

#include <iostream>
using std::cin;
using std::cout;
using std::endl;
class Clock{ 
    public:
    	void setTime(int newS = 0, int newM = 0, int newH = 0){
    	//这一步如果想要输出默认值,应该把主函数里的setTime函数中的参数删除。
            second = newS;
            minute = newM;
            hour = newH; 
        }
    	void showTime();
    private:
        int second, minute, hour;
};
void Clock::showTime(){
   cout << hour << ":" << minute << ":" << second <<endl;
}
int main(){
    Clock MyClock;
    int second, minute, hour;
    cin >> second >> minute >> hour;
    MyClock.setTime(second, minute, hour);
    MyClock.showTime();
    return 0;
}

构造函数的性质:
● 不能定义返回值类型,也不能写return语句
●可以有形参,也可以没有形参,可以带有默认参数
●函数名必须和类名完全相同
●可以重载

当我们没有写构造函数时,系统会为我们自动生成一个默认构造函数,这个默认构造函数的参数列表和内容都是空的,所以他什么都不会做!

现在 我们需要创建一个默认构造函数,让对象早初始化的时候把所有的时间全部设置为0。

//在类内定义构造函数时,不能有返回值类型,且构造函数的名字要和类一样,可以有形参也可以没有形参,这里的第一种定义是没有形参的类型:
class Clock{
public:
    Clock(){
        second = 0;
        minute = 0;
        hour = 0;
    }
//如果不写构造函数,那么系统自动生成的构造函数 就是
    Clock(){}
//函数里没有任何内容,所以也不会有操作

第二种定义类型是有参数的形式:

Class Clock{
public:
	Clock(int newS, int newM, int newH){
    second = newS;
    minute = newM;
    hour = newH;
}
}

//或者在类外实现构造函数
Class Clock{
public:
	Clock(int newS, int newM, int newH);
	}
Clock::Clock(int newS, int newM, int newH){
    second = newS;
    minute = newM;
    hour = newH;
}
这里在类外实现构造函数时,函数名前面仍然不要写函数的返回值类型 ,
实现类外构造函数 : 在类内对函数定义,然后在类外 用 
 类名 :: 函数名 ( 参数 ) { 函数体 }   的形式在类外实现构造函数。 

而在类外实现普通函数时,也是在类内先对函数进行定义,然后在类外 用
返回值类型 类名 :: 函数名 ( 参数 ) { 函数体 } 实现,这里需要在类
名前面加上返回值类型

调用带参数的构造函数时,是在对象创建时被调用的:

 Clock MyClock2(1,2,3);

二、复制构造函数

用一个已有的对象,来执行一个新的对象的构造
●复制构造函数具有一般构造函数的所有特性,它的形参是本类的一个对象的引用,作用是用一个已经存在的对象(函数的参数)来初始化一个新的对象。
●复制构造函数的的使用方式 就是引用传参

引用就是 给一个已经存在的变量起一个别名,所以用它的变量名或者别名都可以操作该变量, 复制构造函数就是给已经存在的构造函数起一个别名。

因为:值传递就是当函数发生调用的时候,给形参分配内存空间,然后用实参的值来初始化形参,但是如果参数是一个对象,值传递“初始化形参”这个过程就会造成很多额外的时间开销,浪费系统资源,如果使用引用就不会有这样的问题。

复制构造函数能实现同类对象之间数据成员的传递。 当我们没有定义类的构造韩函数时,系统就会在必要的时候自动生成一个隐含的复制构造函数,他的作用是把初始对象的每一个数据成员的值都复制到新建的对象中,这就完成了同类对象的复制。
复制构造函数的具体声明方式 :

class 类名{
public:
	类名(类名& 对象名){
	//实现
	}
};

实例:
先有一个point类,表示屏幕上的一个点——它包括两个 int 类的私有成员 x , y, 表示这个点的坐标。

class Point {
public:
	Point(Point &p);
private:
	int x,y;
};

//以下代码可实现复制构造函数
Point::Point(Point &p){
	x = p.x;
	y = p.y;
}
//这里复制构造函数访问了Point类的实例对象p的两个私有成员变量 x,y 。我们需要注意的是 ———— private 与 public 的区别是对类来说的,而不是对对象来说。 拷贝构造函数是Point类的成员函数————所以它可以访问类的私有成员变量,这跟具体的对象无关。

复制构造函数被调用主要的三种情况:
●当用类的一个对象去初始化该类的另一个对象的时候:

Point a(1,2);
Point b(a);//用对象a初始化对象b,复制构造函数被调用
Point c = b;//用对象b给对象c赋值,复制构造函数被调用

●当函数的形参是类的对象,调用函数是进行形式结合的时候:

void f(Point p){
    //函数体
}
int main(){
    Point a(1,2);
    f(a);
    return 0;
}

●当函数返回值是类的对象,函数执行完成返回调用者的时候:

Point g(){
    Point a(1,2);
    return a;
}
/*定义在函数中的变量都是局部变量,当函数返回值的时候这些局部变量
都被销毁了。同样,在函数中创建的对象也相同。 return a 这一步返
回的并不是 a 这个对象本身,而是通过复制构造函数,在主调函数中用a
重新构造的对象。在函数调用返回的时候,原来的临时对象 a 的使命已
经完成,随着整个函数中的其他临时变量一起被销毁了。*/

对于复制构造函数,我们还可以自己实现一些有选择、有变化的复制:

Point (point &p){
    x = p.x+10;
    p=p.y;
}

这个函数就会把每一个由复制构造得到的Point对象,横坐标+10.

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

构造函数及复制构造函数 的相关文章

  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • 当Model和ViewModel一模一样的时候怎么办?

    我想知道什么是最佳实践 我被告知要始终创建 ViewModel 并且永远不要使用核心模型类将数据传递到视图 这就说得通了 让我把事情分开 但什么是Model 和ViewModel一模一样 我应该重新创建另一个类还是只是使用它 我觉得我应该重
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 构建 C# MVC 5 站点时项目之间的处理器架构不匹配

    我收到的错误如下 2017 年 4 月 20 日构建 13 23 38 C Windows Microsoft NET Framework v4 0 30319 Microsoft Common targets 1605 5 警告 MSB3
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 学习vue3系列computed

    响应式API中 computed 和之前的 computed 选项用法类似 对于任何复杂逻辑 我们都可能使用计算属性 比如翻转字符串
  • windows下secureCRT远程连接Linux错误

    描述 The server has disconnected with an error Server message reads A protocol error occurred The connection is closed by
  • MIPI D-PHY的初始化(MIPI Alliance & Xilinx)

    DPHY的基本介绍及使用已有很多文章 基本是基于 MIPI Alliance Specification for D PHY 的内容 学习时也以此为准 可参考CSDN上的文章 着重讲述MIPI D PHY的初始化部分 1 D PHY的功能及
  • 服务器2012系统磁盘压缩,windows10 部分文件夹自动勾选了“压缩内容以便节省磁盘空间”...

    您好 根据您的描述 在重启前能够正常取消压缩 但在重启后文件再次被压缩 说明系统功能和组件正常 很可能是某个应用影响了系统导致这个问题 请您仔细回忆下 您是在安装或更新了什么应用后出现该问题的 或使用了空间优化应用 请尝试将其关闭后 查看能
  • 基于Sqli-Labs靶场的SQL注入-54~65关

    目录 Less54 十步以内获取密钥 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less55 十四步以内获取密钥 爆破数据库名 爆破表名 爆破列名 爆破字段值 Less56 十四步以内获取密钥 Less57 十四步以内获取密钥 Less
  • Linux Ubuntu下运行startx后的恢复办法

    解决办法 Alt Ctrl F3 进入控制台界面 提示登录时 输入你的Ubuntu用户名后回车 有密码的话 再输入密码 登录成功 cd 进入你的用户目录 rm rf Xauth 删除 Xauthority文件 Alt Ctrl F7 返回到
  • ROBO Pro的机械臂编程过程

    ROBO Pro是一种用于控制机械臂的软件 它可以使用图形化或文本化的编程方式 机械臂编程的过程大致如下 连接机械臂和电脑 打开ROBO Pro软件 选择合适的模板或创建新的项目 设计编程逻辑 可以使用拖拽或输入代码的方式 调试和运行程序
  • Java基础之static关键字

    目录 静态的特点 第一章 静态代码块 第二章 静态属性 第三章 静态方法 调用静态方法时 静态方法中调用非静态方法时 第四章 static关键字与其他关键字 友情提醒 先看文章目录 大致了解文章知识点结构 点击文章目录可直接跳转到文章指定位
  • GitHub仓库push报错remote: Support for password authentication was removed on August 13, 2021.

    发现GitHub项目从2021年8月13日开始已经不能使用用户名和密码push代码了 搜索了下 有以下两种方法可以尝试 记录一下 ssh 方式 先在电脑上生成ssh的加密公私钥 使用如下命令 命令中要将 C后面的参数设置为自己的github
  • windows文件保护服务器,Windows 文件保护功能的说明

    WFP 功能的工作方式 WFP 功能使用两种机制为系统文件提供保护 第一种机制在后台运行 在 WFP 收到受保护目录中的文件的目录更改通知后 就会触发这种保护机制 WFP 收到这一通知后 就会确定更改了哪个文件 如果此文件是受保护的文件 W
  • 深度学习十大框架比较

    框架比较 转 1 TensorFlow 对于那些听说过深度学习但还没有太过专门深入的人来说 TensorFlow 是他们最喜欢的深度学习框架 但在这里我要澄清一些事实 在 TensorFlow 的官网上 它被定义为 一个用于机器智能的开源软
  • Deeplabcut教程(一)安装(GPU&CPU版本)(纯新人向)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 Deeplabcut是什么 二 使用步骤 1 环境配置 1 1安装anaconda 1 2换源 1 2安装CUDA和CUdnn GPU 2 Deeplab
  • C++类的继承与派生

    一 基本概念 1 类的继承 是新的类从已有类那里得到已有的特性 或从已有类产生新类的过程就是类的派生 原有的类称为基类或父类 产生的新类称为派生类或子类 2 派生类的声明 class 派生类名 继承方式 基类名1 继承方式 基类名2 继承方
  • 罗技键盘蓝牙搜不到

    罗技K580蓝牙键盘 长按F11 F12在macbookpro 搜索不到 首先 按一下 fn esc 然后长按F11 F12 就可以搜到了
  • 从0开始搭建react项目

    一 项目创建 插件安装 前端项目的创建有三种方式 参考https juejin cn post 6844903953524588552 在html中引入react react dom Babel 使浏览器识别JSX语法 等 使用官方脚手架c
  • Missing variable is:CMAKE_CUDA_DEVICE_LINK_EXECUTABLE

    Linux平台下使用CMAKE3 10 2与CUDA10 2混合编程时出现错误 Missing variable is CMAKE CUDA DEVICE LINK EXECUTABLE 根据https github com colmap
  • 如何遍历一个对象所有的属性并判断属性值

    最近的项目里的一个需求 要我判断一个对象里的所有属性 是否存在值不是 或是null的 public boolean checkGoodMode List
  • 服务器物理内存稳定90%多,服务器物理内存使用率90以上

    服务器物理内存使用率90以上 内容精选 换一换 系统每30秒周期性检测HDFS服务直接内存使用状态 当检测到DataNode实例直接内存使用率超出阈值 最大内存的90 时 产生该告警 直接内存使用率小于阈值时 告警恢复 DataNode可用
  • android自定义圆环控件 滑动选择百分比

    之前做了一个聊天应用 其中需要一个圆环控件 滑动可以选择百分比 看效果图 这个自定义view可以分几步完成 画绿色圆环 画灰色圆环 画三角形 画百分比 其中三角形围绕环形旋转 采用Path类实现 首先画出基本的三角形路径 而后适当计算一下
  • 构造函数及复制构造函数

    一 构造函数 是为了让我们自己去规定 我们定义对象的初始化 这里给出一段程序 作用是按格式输出 输入的时间 include