文章目录

  • 类和对象
    • 构造函数
    • 构造函数的特性
    • const修饰类的成员函数
    • 析构函数

类和对象

如果一个类中我们自己什么成员也没有给出,我们称之为空类。但是要注意的是空类并不是真的什么都没有,任何一个类在我们不写入成员的情况下都会自动生成下面六个默认构造函数。

  • 初识化和清理
    构造函数
    析构函数

  • 拷贝复制
    拷贝构造函数
    赋值操作符重载

  • 取地址重载
    普通对象和const对象取地址

构造函数

构造函数是一个特殊的成员函数,名字与类名相同,没有返回值,在用类实例化对象时由编译器自动调用,目的是使每一个数据成员都有一个合适的初始值,由于构造函数是在实例化对象时自动调用的,所以在对象的生命周期内只调用一次,就是在对象“出生”的时候。

#include<iostream>
using namespace std;
class Test
{public://构造函数Test(){cout <<"我是构造函数" << "Test::Test" << endl;m_data = 0;}//构造函数生来就是为了给成员变量初始化值的Test(int data){m_data = data;}
public:void SetData(int data){cout << "Test::SetData" << endl;m_data = data;}void GetData()const{cout << "data=" << m_data << endl;}
private:int m_data;
};
int main()
{Test A;Test B;A.GetData();B.SetData(0);B.GetData();
}

我们来看一下执行结果:

我们看到“我是构造函数”这句话出现了两次,同时我们也是实例出了两个对象A和B,所以,不难看出,构造函数在实例化对象的时候由编译器自动调用,同时,B调用了SetData函数,最后结果和A一样,说明我们的构造函数完成了和SetData一样的功能,去初始化对象。
另外,我们的构造函数可以重载,上述例子中就重载了两个构造函数,补充一句,重载函数要保证参数列表不相同。

构造函数的特性

  • 函数名与类名相同
  • 无返回值
  • 对象实例化时编译器自动调用对应参数列表的构造函数
  • 构造函数可以重载
  • 如果类中没有显式的定义构造函数,那么C++编译器会自动生成一个无参的构造函数,一旦用户显式定义就不再生成。
 Test C();//是函数C,返回值为Test类的对象//       函数名为C//       无参数Test C;//对象C,调用无参的构造函数Test D(10);//对象D,调用有一个参数的构造函数

当调用无参的构造函数时,对象名后面一定不能加括号!!一旦加了括号,就变成函数了申明了

  • 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没有显式定义构造函数所以由编译器自动生成的构造函数,都可以认为是默认构造函数。所以来看一下下面这段代码:
#include<iostream>
using namespace std;
class Data
{public:Data(){m_year = 2022;m_month = 9;m_day = 28;}Data(int year = 2022, int month = 1, int day = 1){m_year = year;m_month = month;m_day = day;}
private:int m_year;int m_month;int m_day;
};
int main()
{Data day1;//会报错的return 0;
}

我们来看一下错误信息:


这就佐证了我们上面强调的内容。

  • 在我们自己不实现构造函数的情况下,编译器会自动生成一个默认的构造函数,但是大家可能会疑惑,生成的这个默认的构造函数有什么用呢?我们也都知道,编译器生成的默认的构造函数在实例化对象之后对象的数据成员还是随机值,那就更疑惑了,要它到底干啥呢?我们可能会觉得编译器生成的默认构造函数可能并没有什么用处……

来看下面这段代码,我们来体会一下它有什么用处。

#include<iostream>
using namespace std;
class Time
{public:Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};
class Date
{private:// 基本类型(内置类型)int _year;int _month;int _day;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}

来看一下我调试后的结果:


看到了吗?Data类里面我们并没有看到调用了Time类的构造函数,但是事实确实是调用了Time类的构造函数,因为那三个数据已经被初始化了,被赋值为0了,是不是很神奇,所以我们解答一下上面的问题

C++把类型分为内置类型和自定义类型。内置类型就是基本类型,是语法已经定义好了的类型,例如int、char、float等等,自定义类型就是我们用struct、class、union自己定义的类型,通过上述程序,我们可以发现是Data类的由编译器自动生成的默认构造函数调用了自定义类型成员_t的构造函数。

const修饰类的成员函数

用const修饰的类的成员函数被称为const成员函数,形式大概如“void show() const”。

class Test
{public://void SetData(Test * this,int data)//上面的函数头是显式的展示this指针void SetData(int data){m_data = data;}//int ShowData(Test * const this)//const实际上是修饰了this指针int ShowData()const{return m_data;}//const保证对象不被修改
private:int m_data;
};

另外需要注意的是this指针由编译器自动隐藏生成,不能自己写,注意了是不能,不是不需要自己写,下面来看看咱们写了this指针的后果。

当函数中不改变数据的值的时候,例如返回某个成员变量,就可以把函数设置成const成员函数,提高数据的安全性。

我们来思考一下const引出的以下几个问题:

    1. const对象可以调用非const成员函数吗?
      不可以
    1. 非const对象可以调用const成员函数吗?
      可以
    1. const成员函数内可以调用其它的非const成员函数吗?
      不可以
    1. 非const成员函数内可以调用其它的const成员函数吗?
      不可以

析构函数

前面我们提到了构造函数,知道了对象是怎么“出生”的,今天我们来了解一下对象是怎么“死亡”的。

析构函数:与构造函数功能相反,析构函数不是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。

析构函数是特殊的成员函数,其特征如下:

  • 1、析构函数函数名是在类名前加上字符~;
  • 2、析构函数无参数也无返回值;
  • 3、一个类有且仅有一个析构函数,如果没有显式的定义,系统会自动生成默认的析构函数;
  • 对象生命周期结束时,C++编译器会自动调用析构函数。

类和对象1-构造函数、析构函数相关推荐

  1. C++编程入门系列之十四(类与对象:构造函数和析构函数)

    C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...

  2. C++ 笔记(17)— 类和对象(构造函数、析构函数、拷贝构造函数)

    1. 构造函数 构造函数是一种特殊的函数(方法),在根据类创建对象时被调用.构造函数是一种随着对象创建而自动被调用的函数,它的主要用途是为对象作初始化. 构造函数的名称与类的名称是完全相同的,并且不会 ...

  3. 初入C++(二)类和对象,构造函数,析构函数

    1.c++类的声明和定义. class student { public: char *name; int age; float score; void say(); }; void student ...

  4. 类与对象(中) 构造函数和析构函数

    目录 一.类的6个默认成员函数 二.构造函数 2.1定义 2.2特性 1. 函数名和类名相同: 2. 没有返回值: 3.对象实例化的时候编译器自动调用: 4.可以函数重载. 2.3 无参的构造函数和全 ...

  5. day16 初识面向对象编程(类与对象、构造函数与对象,类与类)

    目录 一.面向对象和面向过程的区别 二.类与对象的概念 三.构造函数和对象的关系 三.类与类的关系:组合 四.类与类的关系:依赖 一.面向对象和面向过程的区别 面向过程:强调过程步骤 面向对象:强调对 ...

  6. C++ 课程作业 类与对象2——构造函数、拷贝构造函数、析构函数(油桶题)

    首先题目要求 某工厂使用一种圆柱形的铁桶来运输色拉油,但是关于该油桶的容量已经模糊,现在工人们测得了油桶直径和高(由键盘输入),请帮工人们计算一下油桶容量和制造该油桶需要的铁皮面积. 注意这个油桶是有 ...

  7. 【C++】类和对象——拷贝构造函数

    文章目录 什么是拷贝构造函数 为什么拷贝构造要传引用 默认拷贝构造函数 浅拷贝和深拷贝 编译器可能的优化 自定义类型做函数返回值时传值返回 自定义类型做函数参数时传值调用 总结一下 什么是拷贝构造函数 ...

  8. 3-6:类与对象下篇——构造函数中的初始化列表、匿名对象和explicit关键字

    文章目录 (1)真的是初始化吗 (2)初始化列表 A:概述 B:哪些成员必须在初始化列表进行初始化 (3)注意 (4)匿名对象 (5)explicit关键字 (1)真的是初始化吗 前文中,我们使用构造 ...

  9. 对象特性-构造函数和析构函数

    基础概念: 构造函数:是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数 ,可根据其参数个数的不同或 ...

  10. C++ 类与对象_类的其他成员(常成员,静态成员,友元)

    系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...

最新文章

  1. 北京钛谷诚泽网络通讯科技有限公司
  2. 从JDK源码角度看Long
  3. 071_html语言代码
  4. 如何成为强大的程序员?(转)
  5. windows的bpython安装方法以及数据库报错--记录
  6. java api文档_细说API – 文档和前后端协作
  7. jakarta ee_Jakarta EE贡献–入门
  8. SQL数据库调优之性能监视篇
  9. kali如何取得超级用户权限_微商如何取得好的口碑?好的口碑等于信任微商如何提高用户信任?...
  10. Java多线程(四)——多线程数据隔离与共享
  11. java.lang.IllegalStateException: Async support must be enabled on a servlet and for all filters invo
  12. C# 判别系统版本以及Win10的识别办法
  13. java根据cookie统计uv,利用Cookie统计UV流量 | 学步园
  14. 服务器自检后显示scsi,“服务器百问百答”服务器怎样格式化SCSI硬盘?
  15. ubuntu18.04 pybluez pip3安装
  16. numpy中的统计函数
  17. MBR膜持续发力 守护绿水青山
  18. 32层3D NAND速度直逼内存,长江存储是在画饼吗?
  19. 内部UML培训文件,欢迎大家批评指正
  20. windows:QueryPerformanceCounter函数/PerformanceCounter函数

热门文章

  1. AV转WIFI无线图传模块兼容CVBS和AHD
  2. 多html整理合并pdf
  3. adobe acrobat 拆分合并pdf
  4. IOS 之 NSArray 数组方法详解(3)
  5. 中国工程院院士李伯虎:我国已经进入云制造2.0阶段
  6. 大疆新品:沉浸式飞行体验(DJI FPV )
  7. 乐淘网转型卖鞋子称物流是电子商务最大成本
  8. fresco简单使用
  9. 射频功率放大器 PA 的基本原理和信号分析
  10. 增益自动切换电压放大电路设计