当前位置: 首页 > news >正文

类与对象(中--构造函数)

类与对象(中--构造函数)

  • 1、构造函数的特性
  • 2、默认构造函数
  • 3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)
    • 3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用,对 内置类型的成员变量 不做处理
    • 3.2 针对编译器自动生成的默认构造函数,无法对内置类型成员变量进行初始化的缺陷
  • 4、总结是否在类中写构造函数

//构造函数(在对象实例化时,就完成对对象的初始化工作)
//作用:构造函数主要完成初始化工作(这样就会避免忘记对对象初始化)

1、构造函数的特性

//构造函数是特殊的成员函数。构造函数的作用是初始化对象,并非开空间创建对象(这是编译器完成的)。// 其特征如下:
//(1)函数名与类名相同。
//(2)无返回值。(并非是 void, void是空返回值)
//(3)对象实例化时,编译器会自动调用对应的构造函数。
//(4)构造函数可以重载。class Data
{
public://A 无参构造函数Data(){}//B 带参构造函数Data(int year, int month, int day){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;};int main()
{Data d1;Data d2(2023, 7, 31); //d1和d2两个对象在实例化时,调用Data函数构成函数重载。return 0;
}

2、默认构造函数

//主要分为三类:无参构造函数(自己写的)【Data()】、全缺省构造函数(自己写的)(有参的)【Data(int year=1,int month=1,int day=1)】以及 编译器默认生成的构造函数(自己没写)。
//特点:(1)不用传参数就可以调用。(2)在调用的过程中只存在一个(虽然在语法角度,无参构造函数和全缺省构造函数可以同时存在;但是在函数调用的过程中会存在歧义。)
//用法:最佳用法是只保留:全缺省构造函数(既可以无参调用,也可以有参调用,也不会产生调用歧义)class Data
{
public://全缺省构造函数Data(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}private:int _year;int _month;int _day;
};int main()
{Data d1;Data(2022, 7);Data d2(2023, 7, 31);return 0;
}

3、编译器自动生成的默认构造函数(无参的)(当我们不写构造函数时)

//通俗分析:当我们自己在类中定义了构造函数,编译器就不会自动生成。当我们自己没有在类中定义构造函数,编辑器就会自动生成。class Data
{
public:private:int _year;int _month;int _day;
};int main()
{Data d1;return 0;
}

3.1 编译器自动生成的默认构造函数只对 自定义类型的成员变量 起作用,对 内置类型的成员变量 不做处理

//内置类型:语法自带的,不用定义就可以用的类型,char\int\double\float以及指针(BTNode*)等类型。
//自定义类型:需要定义过才可以用的类型,例如:ListNode\BinaryTreeNode等//特点:
//A 内置类型成员变量不做处理
//B 自定义类型成员变量会去调用它(这个自定义类型成员变量)的默认构造函数(如果没有默认构造函数,就无法编译通过)。
class Time
{
public:Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;};class Data
{
public://不写,默认生成构造函数
private:int _year;int _month;int _day;//Time _t; //任意类型的指针都是内置类型Time _t;
};int main()
{Data d1;return 0;
}

3.2 针对编译器自动生成的默认构造函数,无法对内置类型成员变量进行初始化的缺陷

//C++11打了个补丁:内置类型成员变量在类中申明时,可以给缺省值。
class Time
{
public:Time(){cout << "Time()" << endl;_hour = 0;_minute = 0;_second = 0;}
private:int _hour;int _minute;int _second;
};class Data
{
public://不写,默认生成构造函数
private:int _year = 1;int _month = 1; //这儿给的1是缺省值;因为这儿是内置类型成员变量的申明。int _day = 1;Time _t;
};int main()
{Data d1;return 0;
}

4、总结是否在类中写构造函数

//(1)一般的类都不会让编译器默认生成构造函数,都会自己写。显示写一个全缺省构造函数,非常好用。
//(2)在某些特殊情况下,让编译器默认生成构造函数。
//例如:
#include <iostream>
#include <assert.h>
using namespace std;typedef int DataType;
class Stack
{
public:Stack(int capacity = 3){_array = (DataType*)malloc(sizeof(DataType) * capacity);assert(_array);_capacity = capacity;_size = 0;}
private:DataType* _array;int _capacity;int _size;};class MyQueue
{
public:void push(int x) {}//...
private:size_t _size = 0;  //这儿就发挥了 C++11加入缺省值补丁 的作用Stack _st1;Stack _st2;
};int main()
{MyQueue q; //MyQueue 用默认生成的构造函数就挺好的,不需要显示写。return 0;
}
http://www.lryc.cn/news/103926.html

相关文章:

  • Makefile学习1
  • 城市内涝监测预警系统,科学“智治”应对灾害
  • 切片[::-1]解析列表list表示的“非负整数加1”
  • Mac下certificate verify failed: unable to get local issuer certificate
  • Django项目启动错误
  • Vue2 第十二节 Vue组件化编程 (二)
  • pycharm 远程连接服务器并且debug, 支持torch.distributed.launch debug
  • SAP ABAP 基础语法超详细
  • html学习3(表格table、列表list)
  • 【SpringBoot】85、SpringBoot中Boolean类型数据转0/1返回序列化配置
  • hbase优化:客户端、服务端、hdfs
  • docker安装memcached
  • Redis 客户端有哪些?
  • smbms 超市订单管理系统设计与实现计划表
  • 如何解决制造业数字化改造的障碍?
  • 代码随想录算法训练营day49
  • 云计算与大数据——部署Kubernetes集群+完成nginx部署(超级详细!)
  • Maven 打包项目后,接口识别中文乱码
  • 计算机视觉项目中的文件批量操作与文件批量预处理
  • PHP数组转对象和对象转数组
  • 前后端分离开发中的传参
  • mount: wrong fs type, bad option, bad superblock报错 ubuntu
  • 【图像分类】CNN+Transformer结合系列.3
  • IDA分析实例android_crackme/EasyJNI/Transformers/pingan2
  • 拿捏--->求一元二次方程的根
  • 深入浅出之Docker Compose详解
  • spring5源码篇(12)——spring-mvc请求流程
  • 风辞远的科技茶屋:来自未来的信号枪
  • MongoDB教程-8
  • Redis 理论部分