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

做医院网站网址之家

做医院网站,网址之家,php网站建设培训,山东一级造价师文章目录 1.类的默认成员函数2.构造函数 1.类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前…

文章目录

  • 1.类的默认成员函数
  • 2.构造函数


1.类的默认成员函数

默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,需要注意的是这6个中最重要的是前4个,最后两个取地址重载不重要,我们稍微了解一下即可。其次就是C++11以后还会增加两个默认成员函数,移动构造和移动赋值,这个我们后面再讲解。默认成员函数很重要,也比较复杂,我们要从两个方面去学习:

  • 第一:我们不写时,编译器默认生成的函数行为是什么,是否满足我们的需求。

  • 第二:编译器默认生成的函数不满足我们的需求,我们需要自己实现,那么如何自己实现?

94f52ac11a40feabfa6b547ba22882fe


2.构造函数

构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时,空间就开好了),而是对象实例化时初始化对象。构造函数的本质是要替代我们以前StackDate类中写的Init函数的功能,构造函数自动调用的特点就完美的替代的了Init

构造函数的特点:

  1. 函数名与类名相同。

  2. 无返回值。 (返回值啥都不需要给,也不需要写void,不要纠结,C++规定如此)

  3. 对象实例化时系统会自动调用对应的构造函数。

  4. 构造函数可以重载。

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

  6. 无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。

    无参构造函数和全缺省构造函数虽然构成函数重载,但是调用时会存在歧义。要注意很多同学会认为默认构造函数是编译器默认生成那个叫默认构造,实际上无参构造函数、全缺省构造函数也是默认构造,总结一下就是不传实参就可以调用的构造就叫默认构造。

  7. 我们不写,编译器默认生成的构造,对内置类型成员变量的初始化没有要求,也就是说是是否初始化是不确定的,看编译器。对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错,我们要初始化这个成员变量,需要用初始化列表才能解决,初始化列表,我们下个章节再细细讲解。

说明:C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的原生数据类型。

如:int/char/double/指针等,自定义类型就是我们使用class/struct等关键字自己定义的类型。

#include<iostream>
using namespace std;class Date
{
public:// 1.无参构造函数Date(){_year = 1;_month = 1;_day = 1;}// 2.带参构造函数Date(int year, int month, int day){_year = year;_month = month;_day = day;}//无参构造函数,全缺省构造函数,不写构造时编译器默认生成的构造函数,都叫做默认构造函数。但是这三个函数有且只有一个存在,不能同时存在。/* 3.全缺省构造函数Date(int year = 1, int month = 1, int day = 1){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{// 如果留下三个构造中的第二个带参构造,第一个和第三个注释掉// 编译报错:error C2512: “Date”: 没有合适的默认构造函数可用Date d1; // 调用无参构造函数Date d2(2025, 1, 1); // 调用带参的构造函数// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则编译器无法区分这里是函数声明还是实例化对象//Date d3();// warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)d1.Print();//1/1/1d2.Print();//2025/1/1return 0;
}
class Date
{
public:/*// 如果用户显式定义了构造函数,编译器将不再生成Date(int year, int month, int day){_year = year;_month = month;_day = day;}*/void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:int _year;int _month;int _day;
};int main()
{// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数// 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成// 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用Date d1;Date d2;//下面是编译器自动生成的值d1.Print();//-858993460--858993460--858993460//d2.Print;//会报错return 0;
}
class Date
{
public:void Print(){cout << _year << "-" << _month << "-" << _day << endl;}private:// 内置类型// C++11支持,这里不是初始化,因为这里只是声明// 这里给的是默认的缺省值,给编译器生成默认构造函数用int _year=1;int _month=1;int _day=1;// 自定义类型//Stack _st;
};int main()
{// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数// 将Date类中构造函数放开,代码编译失败,因为一旦显式定义任何构造函数,编译器将不再生成// 无参构造函数,放开后报错:error C2512: “Date”: 没有合适的默认构造函数可用Date d1;Date d2;//下面是编译器自动生成的值d1.Print();//1-1-1//d2.Print;//会报错return 0;
}

1、一般情况下,有内置类型成员,就需要自己写构造函数,不能用编译器自己生成的。

2、全部都是自定义类型成员,可以考虑让编译器自己生成

下面看两个代码的区别:

class Date
{
public:void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};typedef int STDataType;
class Stack
{
public:Stack(int n = 4){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}private:STDataType* _a;size_t _capacity;size_t _top;
};// 两个栈实现一个队列
class MyQueue
{
private:Stack _pushst;Stack _popst;int _size;
};int main()
{// 不传实参调用构造,都叫默认构造Date d1;d1.Print();Stack st1;MyQueue mq;return 0;
}

可以运行。

class Date
{
public:void Print(){cout << _year << "/" << _month << "/" << _day << endl;}private:int _year;int _month;int _day;
};typedef int STDataType;
class Stack
{
public:Stack(int n){_a = (STDataType*)malloc(sizeof(STDataType) * n);if (nullptr == _a){perror("malloc申请空间失败");return;}_capacity = n;_top = 0;}private:STDataType* _a;size_t _capacity;size_t _top;
};// 两个栈实现一个队列
class MyQueue
{
private:Stack _pushst;Stack _popst;int _size;
};int main()
{// 不传实参调用构造,都叫默认构造Date d1;d1.Print();Stack st1;MyQueue mq;return 0;
}

运行报错。

这两段代码唯一的区别就是第19行,一个是Stack(int n = 4)一个是Stack(int n)

那么为什么前者可以,后者不行呢?

因为前者是无参构造函数

后者是带参构造函数

前面说到对于自定义类型成员变量,要求调用这个成员变量的默认构造函数初始化。如果这个成员变量,没有默认构造函数,那么就会报错

无参构造函数、全缺省构造函数、我们不写构造时编译器默认生成的构造函数,都叫做默认构造函数。

而带参构造函数不是默认构造函数,所以会报错。

http://www.mmbaike.com/news/104297.html

相关文章:

  • 徐州丰县建设局网站网站整站优化公司
  • 网站建设需要什么专业app推广引流方法
  • 北京好的网站设计公司软件推广赚佣金渠道
  • 网站建设与网页设计作业网页自动点击软件
  • 贵州省新闻联播seo站长工具查询
  • 快速网站开发介绍优化关键词排名提升
  • python基于web开发的网站开发云搜索网页版入口
  • 广告公司怎么做外贸谷歌优化
  • 手工做的网站百度搜索怎么优化
  • 网站服务器买了后怎么做的万能软文模板
  • tomcat 怎么做网站西安整站优化
  • 南昌市公司网站建设百度站长工具综合查询
  • 怎么做网站的api营销策略4p
  • github做自己的网站荆州百度推广
  • 百度智能小程序生态免费seo免费培训
  • 微网站制作互联网营销师证书骗局
  • 工商网站查询企业信息官网免费seo优化
  • 手机网站抢拍是怎么做的专业代写软文
  • 主播网站建立网络营销软件下载
  • 营销型集团网站建设软文广告成功案例
  • 做汤的网站cpv广告联盟
  • 网站二维码怎么制作成都百度提升优化
  • 政府网站管理系统windows优化软件
  • 个人网站设计教程搜索关键词排名优化
  • 深圳做电商平台网站建设微信软文范例100字
  • 网站的领券商城怎么做seo短视频入口引流
  • 做50个网站百度sem竞价托管
  • 网站做seo屏蔽搜索石家庄seo网络推广
  • 建设银行信用卡卡网站比较靠谱的推广公司
  • 北京微网站开发新媒体营销推广公司