0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

函数结构的定义和例程说明

CHANBAEK 来源:明解嵌入式 作者:Sharemaker001 2023-04-19 11:35 次阅读

一、函数结构定义

在理解拷贝构造函数前,还是有必要回顾下类的构造函数基本概念。 类的构造函数是一种特殊的成员函数,它在创建类的对象时执行。 构造函数的函数名和类名一致,它不会返回任何类型,同样返回类型也不是void,一般构造函数用来初始化类的成员变量。

class Object
{
   public:
      Object();  // 构造函数
   private:
      Object obj;
};
//构造函数结构定义
Object::Object(void)
{
    obj = 0;
    cout << "Object is init" << endl;
}

拷贝构造函数,又叫做复制构造函数,从字面上看,是通过复制对象的方式创建一个新对象。 因此,它通过编译器调用实现使用同一个类中之前创建的对象来完成新创建对象的初始化。 其函数结构如下:

Object::Object(const Object& obj)
{
}

拷贝构造函数的形参必须为引用,即参数前加上“&”。 使用引用是因为如果使用传值的方式将实参传给形参,中间过程需要经历一次对象拷贝的过程,对象拷贝又需要调用拷贝构造函数,因此为了防止无限的构造,形成死循环递归,拷贝构造函数的形参必须为对象的引用。

拷贝构造函数形参可以是const引用,也可以是非const引用。 但是一般使用const,这样既能以常量对象(初始化后值不能改变的对象)作为参数去初始化别的对象,也能以非常量对象作为参数去初始化别的对象。

二、例程说明

如果不在类中显式的声明一个拷贝构造函数,那么编译器会自动的为类生成一个拷贝构造函数,自动生成的拷贝构造函数功能简单,即为新对象复制源对象的所有成员。

#include
using namespace std;
class Object
{
public:
   Object(int a, int b);  //构造函数
   void display();
private:
    int m_a;
    int m_b;
};
Object::Object(int a, int b)
{
    m_a = a;
    m_b = b;
}
void Object::display()
{
    cout<

==

运行结果为:

1,9

可以看出默认的拷贝构造函数功能就是将之前创建的对象成员的值都拷贝给了新对象成员的值。

一般可以显式的声明一个拷贝构造函数,如果编写了拷贝构造函数,那么默认的拷贝构造函数就不存在了,可以在自己编写的拷贝构造函数中增加自定义内容。

#include
using namespace std;
class Object
{
public:
   Object(int a, int b);  //构造函数
   Object(const Object& obj); //拷贝构造函数
   void display();
private:
    int m_a;
    int m_b;
};
Object::Object(int a, int b)
{
    m_a = a;
    m_b = b;
    cout<<"copy function init"<

运行结果为:

copy function init
1,9

可以看出自己编写的拷贝构造函数不仅将之前创建的对象成员的值都拷贝给了新对象成员的值,而且输出自定义的打印内容。

三、应用场景

一般来说,拷贝函数被调用有这样几种基本场景:

(1)、通过使用同一个类中已有的对象来初始化新创建的对象。

Object obj2(obj1);   //用拷贝构造函数初始化obj2 
Object obj3 = obj1;  //用拷贝构造函数初始化obj3

(2)、复制对象把它作为参数传递给函数。

#include
using namespace std;
class Object 
{
public:
   Object(int a);  //构造函数
   Object(const Object& obj); //拷贝构造函数
public:
    int m_a;
};
Object(int a) 
{ 
    m_a = a; 
};
Object(const Object& obj) 
{
    m_a = obj.m_a;
    cout<<"copy function init"<

运行结果为:

copy function init

可以看出,Fun()函数的形参obj在初始化时调用了复制构造函数。 即作为形参的对象,是用复制构造函数初始化的,而调用复制构造函数时的参数,就是调用Fun()函数时所传递的实参obj1。

(3)、复制对象并从函数返回这个对象。

#include
using namespace std;
class Object 
{
public:
   Object(int a);  //构造函数
   Object(const Object& obj); //拷贝构造函数
public:
    int m_a;
};
Object(int a) 
{ 
    m_a = a; 
};
Object(const Object& obj) 
{
    m_a = obj.m_a;
    cout<<"copy function init"<

运行结果为:

copy function init
1

可以看出,调用的Fun()函数,它的返回值是一个对象,该对象就是用复制构造函数初始化的, 即调用复制构造函数时,复制构造函数时的实参,就是Fun()函数return语句所返回的对象。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3868

    浏览量

    61308
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48614
  • 变量
    +关注

    关注

    0

    文章

    595

    浏览量

    28112
  • void
    +关注

    关注

    0

    文章

    23

    浏览量

    9779
  • CONST
    +关注

    关注

    0

    文章

    43

    浏览量

    7998
收藏 人收藏

    评论

    相关推荐

    队列相关素材(函数定义以及例程

    队列相关素材(函数定义以及例程)分享
    发表于 03-23 20:27

    PICC库函数说明(共43页pdf)

    目的进行叙述性描述。 例程:给出一个能说明函数的应用例子。 数据类型:列出函数中使用的一些特殊的数据类型(如结构体等)的C语言
    发表于 07-03 01:52

    基于SYS/BIOS以太网例程中几个函数在哪儿定义

    找不到这几个函数的使用说明,根据函数的名字,我想应该在EMAC/MDIO CSL layer函数中,但是根据sprufp2a.pdf也没有找到相关的
    发表于 08-27 08:35

    例程拷贝中断函数没被定义

    EMIF_AD7606V2例程中的lcd.c程序中是这样的,但是我将这个lcd.c程序复制到另一个例程中就变成,里面的中断函数都变成没有颜色的,也就是没被定义,我想问一下,问题出在哪里
    发表于 11-06 12:31

    EMIF_AD7606例程中一个函数怎么找到函数定义

    EMIF_AD7606例程中一个函数找不到函数定义呢?如何找到啊?
    发表于 03-24 10:59

    如何定义结构体?

    什么是结构体,如何定义结构体? 温馨提示: 请从以下链接中的帖子学习相关内容并进行回答,其他地方得到的答案不能作为标准答案,仅能做为补充说明,七天之内答案不可见,答题的童鞋有七天
    发表于 05-08 05:55

    函数定义是什么

    函数定义函数定义就是函数体的实现编写函数存根,为尚未编写好的代码占好位置,可以保持程序在
    发表于 12-17 07:03

    ALIENTEK MiniSTM32开发板例程(库函数版本)

    ALIENTEK MiniSTM32开发板例程(库函数版本)_标准例程+扩展例程
    发表于 07-25 17:45 1次下载

    Arduino程序结构及基本函数的详细资料说明

    本文档的主要内容详细介绍的是Arduino程序结构及基本函数的详细资料说明
    发表于 06-17 17:44 7次下载
    Arduino程序<b class='flag-5'>结构</b>及基本<b class='flag-5'>函数</b>的详细资料<b class='flag-5'>说明</b>

    模数转换器ADC的应用和函数定义等资料说明

    本文档的主要内容详细介绍的是模数转换器ADC的应用和函数定义等资料说明
    发表于 05-28 17:29 19次下载
    模数转换器ADC的应用和<b class='flag-5'>函数</b><b class='flag-5'>定义</b>等资料<b class='flag-5'>说明</b>

    STM32 之 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

    STM32 之 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)
    发表于 12-08 20:36 0次下载
    STM32 之 标准外设版USB驱动库详解(架构+文件+<b class='flag-5'>函数</b>+使用<b class='flag-5'>说明</b>+示<b class='flag-5'>例程</b>序)

    C语言里函数定义、子函数的使用及变量的作用域

    这篇介绍C语言里函数定义、子函数的使用。接着介绍变量的作用域,定义全局变量、静态变量、只读变量、变量初始化等等。
    的头像 发表于 04-28 11:23 5479次阅读

    定义结构体的同时声明变量

    我们可以这样理解,如果我们想要在主函数内使用结构体,那么我们在使用前一定要定义它,因为没有定义便不存在,不存在便无法使用。
    的头像 发表于 03-14 17:29 571次阅读

    python定义函数与调用函数的顺序

    定义函数与调用函数的顺序 函数定义后,本身是不会自动执行的,只有在被调用后,函数才会被执行,得
    的头像 发表于 10-04 17:17 582次阅读

    SCL函数块的结构介绍 创建SCL函数块的步骤说明

    下图显示了 SCL 函数块的结构
    的头像 发表于 10-30 10:16 377次阅读
    SCL<b class='flag-5'>函数</b>块的<b class='flag-5'>结构</b>介绍 创建SCL<b class='flag-5'>函数</b>块的步骤<b class='flag-5'>说明</b>