C++中,类有六个默认函数,分别是:

目录

1、构造函数

2.析构函数

3.拷贝构造函数

4、赋值运算符重载函数

5、取地址操作符重载函数

6、const修饰的取地址符重载函数


1、构造函数

定义:在定义一个对象的同时,希望能给它的数据成员赋值——对象的初始化的成员函数,叫做构造函数。

在C++中,由于类的封装性,它不允许在类的非成员函数中直接访问类对象的私有和保护数据成员,不能在建立类的时候初始化。所以对于类对象数据成员的初始化工作就落到了类对象的成员函数身上,因为它们可以访问类对象的私有和保护成员。

#include<iostream>
using nmespace std;class Clock
{
public:Clock()//构造函数{cout << "Clock()" << endl;hour = 0;minute = 0;second = 0;}void Show(){cout << hour << ":" << minute << ":" << second << endl;}
private:int hour;int minute;int second;
};int main()
{Clock MyClock(8,30,30);MyClock.Show();return 0;
}

特点:

(1)函数名与类名是相同的

(2)在建立对象时,系统自动调用的函数。

(3)这个函数体是空的,默认构造函数并不具备任何功能。

(4)可以重载。

(5)不能够手动调用。

(6)没有返回值

(7)可以在类中定义,也可以在类外定义。

(8)如果用户为类定义了一个构造函数,系统就不会生成任何默认的构造函数。

(9)作为类的成员函数,构造函数可以直接访问类的所有数据成员,可以是内联函数,可以不带任何参数,可以带有参数表以及默认参数值。

PS: 构造函数与其他成员的区别:

(1)构造函数必须和类名相同,而一般成员函数不能和类名相同。

(2)构造函数主要功能在于类的对象创建时定义初始化的状态,没有返回值,不能用void修饰,其他函数可以有返回值,也可以没有,但是必须用void予以说明。

(3)构造函数不能被直接调用,一般成员函数在程序执行时被调用。

2.析构函数

(~构造函数名)

~Clock()
{cout << "~Clock" << endl;
}

定义:在特定对象使用结束后,需要进行一些清理工作由特殊成员函数完成,叫做析构函数。

特点:

(1)没有任何参数,不能被重载,但可以是虚函数,一个类只能有一个析构函数。

(2)没有返回值。

(3)析构函数一般由用户自己定义,在对象消失时由系统自动调用。

(4)默认析构函数是空函数,不做任何事。

3.拷贝构造函数

类名(类型 & 变量名)

Clock(Clock & p)//拷贝构造函数
{cout << "copy Clock(Clock &p)" << endl;hour = p.hour;minute = p.minute;second = p.second;
}

定义:用于在建立新对象时将已存在对象的数据成员值拷贝给新对象,即用一个已存在的对象去初始化一个新建立的对象。

形式:

类名(类名 & 对象名)

{ ... }   //函数体

特点:

(1)拷贝构造函数其实是构造函数的重载

(2)拷贝构造函数的参数必须使用引用传参,不能使用传值传参

(3)如果用户没有定义拷贝构造函数,系统会默认缺省的拷贝构造函数,缺省的拷贝构造函数会依次拷贝类成员进行初始化

PS:

(1)默认的拷贝构造函数是浅拷贝。如果类成员变量有指针,考虑实现深拷贝。

(2)形参一定要加引用。

(3)拷贝构造函数与构造函数有且只会调用一个。

(4)用一个常量初始化新建立的对象时,调用构造函数,不调用拷贝构造函数。

(5)当对象作为函数的返回值时需要调用拷贝构造函数,此时C++将从堆中动态建立一个临时对象,将函数的返回的对象拷贝给该临时对象, 并把该临时对象的地址存储在寄存器里,从而由该临时对象完成函数返回值的传递。

(6)默认的拷贝构造函数是浅拷贝。

(7)在重新定义拷贝构造函数之后,默认拷贝构造函数和默认构造函数就不存在了。

在重新定义构造函数后,默认拷贝构造函数还在,默认构造函数不存在。

(8)在对象进行赋值时,拷贝构造函数不被调用。此时进行的是结构式的拷贝。

拷贝构造函数与对象赋值的区别:拷贝构造函数是用一个存在的对象去构造一个不存在的对象;对象赋值是当两个对象都存在,用一个对象的值去覆盖一个对象的值。

浅拷贝和深拷贝:

深拷贝:实现原对象和新对象之间数据成员之间的拷贝,而且可以为新的对象分配单独的内存资源。

浅拷贝:直接将原对象的数据成员值依次复制给新对象中对应的数据成员,并没有为新对象另外分配内存资源。

4、赋值运算符重载函数

运算符重载定义:使同一个运算符作用与不同类型的数据时导致不同行为的一种机制。

形式:返回值 operator 运算符(参数列表)

运算符函数的参数至少有一个必须是类的对象或者类的对象的引用。这种规定可以防止改变内置类型的函义。

5个不能重载的运算符:

. (成员访问运算符)
.* (成员指针访问运算符)
:: (域运算符)
sizeof (长度运算符)
?: (条件运算符)

规则:

(1)重载后运算符的优先级与结合性不会改变

(2)不能改变原运算符操作数的个数

(3)不能重载C++中没有的运算符

(4)不能改变运算符的原有语义。

5、取地址操作符重载函数

Clock * operator()
{return this;
}

6、const修饰的取地址符重载函数

const Clock * operator&() const
{return this;
}

C++的六个默认函数相关推荐

  1. 继承和多态 2.0 -- 继承的六个默认成员函数

    本文重要介绍普通继承中如何写派生类的六个默认成员函数,主要是针对在派生类中,如何调用基类的六个默认成员函数 需要说明的一点就是,如果子类中没有调用父类的函数时,系统会自动生成一个. 构造函数 子类中有 ...

  2. 【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

    文章目录 一.类的6个默认成员函数 二.构造函数 1.概念 2.特性 2.1特征分析--自动生成 2.2.特征分析--选择处理 2.3特征分析--默认构造 3.C++11补丁--缺省值 三.析构函数 ...

  3. C++11构造与禁用默认函数

    C++11(五)继承构造 在继承体系中,假设派生类想要使用基类的构造函数,必须要在构造函数中显式声明. 举个小例子: class Base { public:int value1;int value2 ...

  4. 第六十六章 Caché 函数大全 $TRANSLATE 函数

    文章目录 第六十六章 Caché 函数大全 $TRANSLATE 函数 大纲 参数 描述 `$TRANSLATE`和`$REPLACE` 示例 第六十六章 Caché 函数大全 $TRANSLATE ...

  5. 第三十六章 SQL函数 CURRENT_TIME

    文章目录 第三十六章 SQL函数 CURRENT_TIME 大纲 参数 描述 小数秒精度 示例 第三十六章 SQL函数 CURRENT_TIME 返回当前本地时间的日期/时间函数. 大纲 CURREN ...

  6. Python编程基础:第五十六节 filter函数Filter

    第五十六节 filter函数Filter 前言 实践 前言 filter函数的作用是对可迭代对象内部的元素按照特定条件进行过滤,其书写方式为filter(function, iterable),第一个 ...

  7. Python编程基础:第四十六节 super函数Super Function

    第四十六节 super函数Super Function 前言 实践 前言 使用super函数可以在子类中直接调用父类的方法.通常情况下,我们会将一些通用的属性或方法定义在父类中,子类可以直接使用父类中 ...

  8. Spring Boot:(六)默认日志logback配置解析

    Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...

  9. C++空类中的默认函数

    参加面试的时候,面试官问到这个问题,我的回答:默认构造函数.默认析构函数.默认拷贝构造函数.默认赋值函数.现在回想起来感觉不对,就google,揭示一下这个看似简单的问题: 一个空的class在C++ ...

最新文章

  1. 激光点云感知 voxnet本质
  2. gin gorm插入数据
  3. python语言用什么来表明每行代码的层次关系_2021年尔雅通识课《切削原理与刀具》课后习题答案...
  4. 长链剖分:O(nlogn)预处理O(1)求kth祖先
  5. simulation pipeline after change not refresh issue
  6. error: ‘CV_BGR2RGB’ was not declared in this scope
  7. dubbo全局异常处理_详解Dubbo无法处理自定义异常及解决方案
  8. 类的使用经典案例使用类的成员函数显示时间、找出元素的最大值【C++面向对象编程】
  9. asp.net 获取访问的url
  10. 打开一个页面,并监听该页面的关闭事件
  11. Android增量更新——bsdiffbspatch
  12. 64位 windows10下 Apache2.4 + php7 + phpstorm 相关设置
  13. 八爪鱼采集ajax表格,如何快速统计简书数据——八爪鱼采集器(二)
  14. 鄂尔多斯固体废物智慧化管理平台设备和功能概况
  15. 我爱淘二次冲刺阶段6
  16. 深夜看了张一鸣的微博,我不得不惊
  17. 《极限逃亡》12.3正式上线链游玩家|末日围城、文明重启
  18. 对金融基础知识的小总结
  19. PHP Yii框架之表单验证规则大全
  20. C#WinForm应用程序——简易摇号系统

热门文章

  1. 启迪公交:DRDS助力城市公交系统智能化
  2. MaxCompute studio与权限那些事儿 1
  3. 彻底理解内存泄漏,memory leak
  4. 浅析低功耗广域网及在智慧城市中的应用
  5. CSDN 独家对话阿里云贾扬清、华先胜等大咖,剧透阿里云原生技术密码
  6. 仅用 2 年过渡到自研 ARM 芯片,苹果的底气从何而来?
  7. 详解GPU技术关键参数和应用场景
  8. 最in的一期,来自大厂的邀请|C课有道
  9. 参数设置_变频器基本参数设置
  10. oracle升级后出现 ora-02055,分布式更新失败 0ra-02055错误 请各位指点(在线等待)...