C++类的构造函数

2023-11-19

构造函数

构造函数的概念

我们有一个Date

class Date
{
public:
	void Init(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;
};

对于Date类,可以通过Init共有方法给对象设置日期,但如果每次创建对象都调用这种方法就太烦了。于是我们可以用构造函数在对象创建时,就将信息设置进去。

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

构造函数的特性

构造函数不能顾名思义!!!。构造函数不是开辟空间创建对象,而是初始化对象。特征有以下4点:

  1. 函数名与类名相同
  2. 没有返回值。
  3. 对象实例化时,编译器自动调用对应的构造函数。
  4. 构造函数可以函数重载
class Date
{
public:
	Date()
	{}
	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 d1;//调用无参构造函数
	Date d2(2022,7,22);//调用待参的构造函数

	Date d3();//这是d3函数的声明,函数无参数,返回一个日期类型的对象
	return 0;
}
  1. 如果类中没用显式定义构造函数(说人话就是你没自己写构造函数),则C++编译器自动生成一个无参的默认构造函数。一旦用户显式定义任何构造函数,编译器将不再生成。
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类中的构造函数放开后,代码不可以通过编译,因为编译没有生成这种无参的构造函数
	Date d1;
	return 0;
}
  1. 不实现构造函数的情况下,编译器会自动生成默认的构造函数,但是d对象的_year等依旧是随机值,似乎编译器生成的默认构造函数没用?

C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类型,如:int/char…,自定义类型就是我们使用class/struct/union等自己定义的类型。编译器生成默认的构造函数会对自定类型成员调用的它的默认成员函数,而对内置类型的量设为随机值。

这是C++设计的一个缺陷。C++11中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

class Date
{
	//...
private:
	int _year = 2022;
	int _month = 7;
	int _day = 22;
};
  1. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参
    构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。所以一下程序出现了“Date::Date”: 对重载函数的调用不明确的报错。
class Date
{
public:
	Date()
	{
		_year = 2022;
		_month = 7;
		_day = 1;
	}

	Date(int year = 2022, int month = 7, int day = 21)
	{
		_year = year;
		_month = month;
		_day = day;
	}

private:
	int _year;
	int _month;
	int _day;
};

int main()
{

	Date d1;//编译失败

	return 0;
}

报错信息

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类的构造函数 的相关文章

  • 将集合绑定到自定义控件属性

    我没有运气尝试将数据集合绑定到我的自定义控件的属性 我已经实现了该控件的字符串属性的机制 在此处提供了一些帮助 并期望集合类型同样简单 但是我无法让它再次工作 这是我的自定义控件视图
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • std::forward_as_tuple 将参数传递给 2 个构造函数

    我想传递多个参数以便在函数内构造两个对象 以同样的方式std pair
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • 如何在标准 WPF ListView 中启用 UI 虚拟化

    我正在使用 NET 4 5 VS2012 并且我有一个 ListView 看起来像这样
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐

  • QT信号和槽机制实现及源码阅读

    说明 QT的信号和槽采用观察者模式 Q OBJECT是提供信号和槽的基础 使用过connect第五个参数的可知 槽可以在信号发出的线程处理 也可以加入任务队列进行处理 但是在此只写了在触发线程处理的代码 如下是实现的类QT信号和槽 gt F
  • 终于有人把软件测试用例讲清楚了(一定要收藏)

    目录 1 公司流程 1 1 测试用例的4个特性 1 1 测试用例通常包括以下几个组成元素 1 编写测试用例的基本方法 1 1 1 概念 1 1 1 示例 1 1练习案例 1 1 边界值法 1 1 1 确定边界值的方法 1 1 因果图法 1
  • ubuntu 20.04装nvidia显卡驱动

    装这个显卡驱动遇到了很多问题 第一次装了两三天没有成功 休息了一个星期 又来试 终于成功了 显卡驱动安装 1 检查自己的显卡型号 lspci grep i vga 会出现一个16进制的数字 选有nvidia的那个就是独显 我的是TU104M
  • visual studio:解决方案资源管理器中限定为此范围的显示与取消

    参考 VS 解决方案资源管理器中限定为此范围的显示与取消
  • 利用python做一个超简单的抽签器

    抽签器 用python写一个超基础的简单版抽签器 我利用了list函数来存储待抽签的选项 先将候选人输入到列表中 再进行随机抽签 以下是代码 一个抽签器 能够从多人中随机抽取一人 import random def random draw
  • Seekbar细节

    Seekbar可以自定义thumb图标 但是有时候发现thumb没有展示完全 或者图标周围显示的是背景色 此时就需要设置一些属性 android background null android thumbOffset 0dp android
  • QT入门之QToolBar

    目录 一 QToolBar界面相关 1 布局介绍 2 界面基本属性 3 添加动作测试 4 代码添加动作 5 创建按钮 此文为作者原创 转载请标明出处 一 QToolBar界面相关 1 布局介绍 先看下界面中创建个toolBar 右键Main
  • 真题详解(传引用)-软件设计(七十五)

    真题详解 补码转换 软件设计 七十四 https blog csdn net ke1ying article details 130674214 分治算法技术设计 答案 1 问题划分 2 递归求解 3 合并解 虚拟存储体系 两级构成 解析
  • 3、RH850端口说明及及复用功能配置

    RH850端口有3种工作模式 通用IO口 普通数字口 PMC控制寄存器对应bit为0 软件配置复用模式 PMC控制寄存器对应bit为1 PIPC寄存器对应bit为0 硬件直接连接模式 PMC控制寄存器对应bit为1 PIPC寄存器对应bit
  • 冒号 定义成员函数_C++ 类成员 类成员的构造 冒号语法

    设有类CTime和CDate分别用于描述时间和日期 另外有CDateTime类描日期和时间 请为三个类给出具体的实现代码 并在main函数中测试 include includeusingnamespace 设有类CTime 和CDate分别
  • XMind 2020 for mac (XMind思维导图)

    xmind 2020中文版是一款十分实用的思维导图软件 相信很多用户都还不了解XMind XMind官方版优化了许多功能 性能上大大提高 使用XMind思维导图可以帮助用户完成逻辑图 树形图 组织结构图等 还可以导出ppt word 图片
  • 【java基础】 方法,实参和形参,方法的重载,签名,递归

    目录 方法概念及使用 实参和形参的关系 重要 方法的重载 方法签名 简单了解 递归 简单介绍 方法概念及使用 方法就是一个代码片段 类似于 C 语言中的 函数 作用 是能够模块化的组织代码 当代码规模比较复杂的时候 做到代码被重复使用 一份
  • element ui表单中嵌套时间和日期下拉选择并且提交给后端

    使用element ui 的
  • vue 中 ‘\“ 替换成 “/“

    var filePath trim filePath val 正则表达式替换字符 对于String对象的replace方法 表达式不加入g 则只替换第一个匹配 如果加入g 则替换所有匹配 var newFilPath filePath re
  • Scope, Duration, and Linkage___CH_6

    Each project corresponds to one program 6 1 Compound statements blocks A compound statement also called a block or block
  • 强化学习代码 (肖志清)部分

    目录部分 1 初识RL 2 Markov 决策过程 3 有模型数值迭代 4 回合更新价值迭代 5 时序差分价值迭代 6 函数近似方法 点击跳转原书代码链接 1 初识RL 解决我电脑中pip install不了的问题 pip install
  • KiCad使用笔记(01)-介绍及设置

    文章目录 为什么使用KiCad 使用前工作 简单认识 主界面 使用流程 已知存在问题 总结 为什么使用KiCad KiCad A Cross Platform and Open Source Electronics Design Autom
  • 动态路由协议OSPF配置实战

    1 OSPF简介 提及 OSFP 时 还得先从 RIP 说起 RIP 以跳数来计算到达目的网络的最优路径 在实际应用时并不合适 以网络带宽和链路时延来衡量网络质量会更合理 RIP 支持的最大跳数是 16 无法用于搭建大规模的网络 RIP 的
  • 【Qt移植到linux】问题6 file not recognized is a directory

    Qt移植到linux 问题6 file not recognized is a directory 2013 09 26 09 38 11 分类 linux 标签 file not recognized is a 举报 字号 订阅 下载LO
  • C++类的构造函数

    构造函数 构造函数的概念 我们有一个Date类 class Date public void Init int year int month int day year year month month day day void Print