目录

一、类的6个默认成员函数

二、构造函数

2.1定义

2.2特性

1、 函数名和类名相同;

2、 没有返回值;

3、对象实例化的时候编译器自动调用;

4、可以函数重载。

2.3 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

2.4 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。

三、析构函数

3.1定义

3.2 特性

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值。

3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

四、总结


一、类的6个默认成员函数

一个类中什么成员也没有,被称为空类。

实际上里面什么都没有吗?不是的。

一个类在我们不写的情况下,都会生成自动生成6个默认成员函数。

我们今天先学习构造函数


二、构造函数

2.1定义

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用在对象的生命周期内只调用一次

class position
{
public:void print(){cout << _compus << " " << _building << " " << _dormitory << endl;}private:int _compus;int _building;int _dormitory;};int main()
{position p1;p1.print();   return 0;
}

我们没有去写初始化函数,我们打印出来的结果如下:

系统会帮我们初始化,只不过初始化完的变量都是随机值。

2.2特性

构造函数是特殊的成员函数,虽然叫构造函数但是它的作用不是开辟空间,而是初始化对象。
其特征如下:
1、 函数名和类名相同;
2、 没有返回值;
3、对象实例化的时候编译器自动调用;
4、可以函数重载。
我们模拟实现下: 
  position(){_compus = 1;_building = 1;_dormitory = 101;//这是无参的构造函数}

调用时:

position p1;

另一种:

   position(int compus=2, int building=2, int dormitory=202){_compus = compus;_building = building;_dormitory = dormitory;//全缺省的构造函数}

调用时:

position p1;//第一种
position p2(1,2,303);//第二种

要注意的是如果不传参数过去不用在 对象后面加括号。

如果要传参数过去直接在 对象后面加括号并且里面将参数放进去,前提是这个构造函数是缺省函数。

1、 函数名和类名相同;

例子中,类和构造函数都叫position。

2、 没有返回值;

例子中,构造函数没有返回值。

3、对象实例化的时候编译器自动调用;

我没去调用构造函数,自动编译器调用。

4、可以函数重载。

  position(){_compus = 1;_building = 1;_dormitory = 101;}position(int compus=2, int building=2, int dormitory=202){_compus = compus;_building = building;_dormitory = dormitory;}

可以函数重载,编译可以通过,但是运行时报错。会发生歧义,编译器不知道用哪个。

2.3 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认成员函数。

 记住:

默认构造函数三类:
无参构造函数、

全缺省构造函数、

我们没写编译器默认生成的构造函数

这个知识点一会会用到。

2.4 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。

我们构造函数什么也不写。

class position
{
public:void print(){cout << _compus << " " << _building << " " << _dormitory << endl;}private:int _compus;int _building;int _dormitory;};

我们来看看编译器自动生成的默认构造函数,会将变量初始化什么样。

那这初始化的变量都是随机值,这编译器自动生成的构造函数也没什么用啊!?

其实,这个构造函数在这里会起作用:

我们不写默认构造函数,编译器会自动生成一个默认构造函数;

c++中会有内置类型/基本类型 (int double  float char  指针......);

和自定义类型(class 和 struct 这类自定义的对象);

 默认构造函数对于内置类型成员变量不做处理(或者说让他们都初始化为随机值),对于自定义类型成员变量才会处理 。

例如:

class Mystack
{
public:Mystack(int capacity = 10){_a = nullptr;_top = 0;_capacity=capacity;}private:int* _a;int _top;int _capacity;
};class Myqueue
{
public:void pop(){}void dele(){}
private:Mystack st1;Mystack st2;
};
int main()
{   Myqueue mq1;return 0;
}

我们调用了Myqueue mq1,接下来编译器要初始化mq1这个对象里的两个变量,但是这两个变量是自定义类型,编译器要对这自定义类型处理,寻根溯源它俩是Mystack的对象,便调用Mystack的默认构造函数来初始化st1和st2。

结果是:

这是我们写了默认构造函数的情况下,不写呢?

那就都是随机值了

总结:
如果,一个类中的成员全是自定义类型,我们就可以用默认构造函数

但这个默认构造函数你不写的话,编译器生成的默认构造函数会将变量初始化为随机值。

所以不想要随机值的话,我们就要自己写默认构造函数。

如果,有内置类型的成员,或者需要传参初始话,就要自己写构造函数。

那我们对象成员里有内置类型不想它是随机值,又不想写构造函数怎么办。

c++11打了一个补丁。

可以这样

class Myqueue
{
public:void pop(){}void dele(){}
private:int a = 10;    Mystack st1;Mystack st2;
};

这里的10不是直接给a定义了,而是给的缺省值,将这个缺省值给系统默认生成的默认构造函数。


三、析构函数

3.1定义

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

3.2 特性

1. 析构函数名是在类名前加上字符 ~。

2. 无参数无返回值。

3. 一个类有且只有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

   ~Mystack(){free(_a);_a = nullptr;_top = _capacity = 0;}

其实析构函数和构造函数一样,也是对内置类型不处理(如果成员里有指针类型,编译器不好处理它不知道这是new的还是malloc的或者fopen的,这样会搞错),对自定义类型处理。

这里就不举例了。

我们来了解下一个问题:

 Myqueue mq1;Myqueue mq2;

这两个对象谁先调用构造函数

肯定是mq1先调用mq2后调用构造函数。

那谁先调用析构函数呢?
答案是:mq2先调用析构函数mq1后调用析构函数。

因为在建立栈帧时,mq1先进入栈帧,mq2后进入,根据栈的特性后进先出,所以是mq2先调用析构函数。(这里只是浅薄地讲下如果想深入了解栈帧可以去查查,或者有可能的话我出一期)

四、总结

构造函数

1、我们写默认构造函数,编译器会自动调用,不写的话,编译器会自动生成默认构造函数,只不过变量会被初始化为随机值。必须是默认构造函数(无参,全缺省)才能自动调用。

2、编译器遇到自定义类型,会回去调用它的默认构造函数。

3、内置类型不想自己写构造函数,但也不想变量经过编译器生成的构造函数初始化为随机值,可以将

析构函数

1、一般情况下,我们类中开辟了空间,我们要自己写,要来释放空间。

2、内置类型一般不做处理。

类与对象(中) 构造函数和析构函数相关推荐

  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. php中的构造函数和析构函数,php 中构造函数和析构函数

    构造函数: 在对象实例化时被调用,一个类中只能有一个构造函数,在类中起初始化的作用. 析构函数: 在对象结束时被自动调用. 话不多说,用一段代码来说明两者的区别: //定义一个类 class Pers ...

  5. 类中构造函数、析构函数与赋值函数的重写

    类中构造函数.析构函数与赋值函数的重写 class String { public: String(const char *str = NULL); // 普通构造函数 String(const St ...

  6. Android SO逆向-对象的构造函数与析构函数

    0x00 这一节我们主要讨论对象的构造函数和析构函数的汇编实现. 0x01 我们先直接看C++代码: #include "com_example_ndkreverse4_Lesson4.h& ...

  7. C++中构造函数和析构函数可以抛出异常吗?

    C++中构造函数和析构函数可以抛出异常吗? 一.  析构函数 参照<Effective C++>中条款08:别让异常逃离析构函数.  总结如下: 1. 不要在析构函数中抛出异常!虽然C++ ...

  8. C++虚继承中构造函数和析构函数顺序问题以及原理

    多重继承的问题:多个类B,C,-继承同一个类A导致如果X继承了B,C,-那么在X中将还有多个A中成员的拷贝,如果想要访问A中的成员如果不加名字空间将会导致二义性,这种拷贝大多是没有实际意义的,为了避免 ...

  9. 实验6.2 定义一个基类BaseClass,观察构造函数和析构函数的执行情况。

    题目 定义一个基类BaseClass,有整型成员变量Number,构造其派生类DerivedClass,观察构造函数和析构函数的执行情况. AC的C++代码如下: #include<iostre ...

最新文章

  1. 深入Jetty源码之HTTP协议
  2. scikit-learn库中聚类算法自定义距离度量方式
  3. 使用7zip压解各种文件的经常使用命令
  4. LoadRunner函数学习--lr_convert_string_encoding
  5. 吐血大奉献,打造cnblogs最新最火辣的css3模板(IE9以下请勿入内) -- 第一版
  6. 中北大学c语言程序设计期末_中北大学:工作室联合育人 家校情温暖寒冬
  7. WPF 四种不同效果呼吸灯
  8. Java EE 8 MVC:控制器的详细介绍
  9. java中随机数边界问题,java 简单Dice问题(随机数的运用)
  10. Java 中关键字transient引出序列化与反序列化
  11. 纳什叫上林书豪,投了一家AI篮球训练公司
  12. Android Junit测试
  13. 深度学习 --- 优化入门二(SGD、动量(Momentum)、AdaGrad、RMSProp、Adam详解)
  14. 一个开源vue网站博客,nuxt开源网站,前后端分离项目
  15. Word文档单页页眉横线如何去除
  16. JQuery slidebox实现图片轮播
  17. html中svg修改背景颜色,如何更改SVG图像中的背景颜色?
  18. AI窥人(三):你想靠AI实现永生吗?
  19. 【Java】月份枚举
  20. 数据挖掘实践 —— OneR 分类算法

热门文章

  1. windows nao naoqi SDK 配置
  2. 前端发送同步请求的三种方式
  3. eBay教程--eBay标题如何进行撰写
  4. [jenkins] 启动错误 Failed to start LSB: Jenkins Automation Server.
  5. 5G如何由浅入深赋能工业互联网?
  6. 联合概率和条件概率区别
  7. 红米4鸿蒙系统刷机包,红米4官方固件rom系统线刷刷机包_红米4线刷官方系统升级包...
  8. HomeBrew的安装和简单使用
  9. MYO肌电臂环中文入门指南(Windows版)
  10. web前端开发与应用——图像运用