C++ 类和对象----构造函数

server/2025/3/18 12:33:37/

一、构造函数

概念:

在平时初始化,都要调用Init公有方法来初始化,调用比较频繁,因此,构造函数就是在对象创建时,就将信息设置进去。

 没有构造函数前:

#include<iostream>
using namespace std;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;
};int main()
{Date d1;d1.Init(2024, 1, 21);d1.print();return 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 d1(2024, 1, 21);d1.print();return 0;
}

构造函数特性:

构造函数是特殊的成员函数,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
 

1.函数名与类名相同

2.无返回值

3.对象实例化时编译器自动调用对应的构造函数

4.构造函数可以重载
 

class Date
{
public:// 1.无参构造函数Date(){}// 2.带参构造函数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; // 调用无参构造函数,// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明d1.print();Date d2(2015, 1, 1); // 调用带参的构造函数d2.print();以下代码的函数:声明了d3函数,该函数无参,返回一个日期类型的对象warning C4930: “Date d3(void)”: 未调用原型函数(是否是有意用变量定义的?)Date d3();return 0;
}

注意:再次强调无参的构造函数是不用加()的,加上()就是函数的调用了

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

(1)、没有显示定义构造函数,则C++编译器会自动生成一个无参的默认构造函数

#include<iostream>using namespace std;class Date
{
public:如果用户显式定义了全缺省构造函数,编译器将不再生成//Date(int year=2024, int month=1, int day=26)//{//_year = year;//_month = month;//_day = day;//}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{// 将Date类中构造函数屏蔽后,代码可以通过编译,因为编译器生成了一个无参的默认构造函数Date d1;d1.Print();return 0;
}

(2)、用户显式定义编译器将不再生成

#include<iostream>using namespace std;class Date
{
public://如果用户显式定义了全缺省构造函数,编译器将不再生成Date(int year=2024, int month=1, int day=26){_year = year;_month = month;_day = day;}void Print(){cout << _year << "-" << _month << "-" << _day << endl;}
private:int _year;int _month;int _day;
};
int main()
{// 将Date类中全缺省构造函数放开	Date d1;d1.Print();return 0;
}

6、C++编译器在编译器生成的默认构造函数对内置类型,依旧是随机值,不做什么改变,但是对自定义类型,会调用它的默认成员函数

内置类型/基本类型 :int/char/double/指针  语言自身定义的类型

自定义类型 :struct/class/union

#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;
}

可以看到,对自定义类型,会先调用它的默认成员函数

对内置类型不做处理,感觉很鸡肋,因此C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。

#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 = 1970;int _month = 1;int _day = 1;// 自定义类型Time _t;
};
int main()
{Date d;return 0;
}


http://www.ppmy.cn/server/175954.html

相关文章

【蓝桥杯速成】| 5.动态规划

学习资料 代码随想录 动态规划五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 简单题 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#…

网络层协议

目录 一、网段划分的发展过程 &#xff08;1&#xff09;固定长度的网络号 &#xff08;2&#xff09;子网掩码---网络号长度不再固定 二、公有IP和私有IP &#xff08;1&#xff09;私有IP &#xff08;2&#xff09;NAT技术 三、IP协议报头 分片操作 四、查看一下li…

Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)

WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始&#xff0c;OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…

算法016——最小覆盖子串

力扣——最小覆盖子串&#xff08;点击跳转&#xff09; 分析题目 我们先随便从一个位置开始&#xff0c;让 right 右移&#xff0c;直到找到符合题目的位置停下 之后&#xff0c;让 left 右移&#xff0c;此时会出现两种情况 仍然符合要求&#xff0c;right 不需要动不符合…

MiddleVR for Unity插件

MiddleVR for Unity插件 “Unity为一款3D应用程序开发工具&#xff0c;使您能够专注于创造令人惊叹的3D应用。”MiddleVR是一个完美的Unity插件&#xff0c;可在几分钟内为你的Unity应用程序带来身临其境的性能&#xff01; MiddleVR For Unity增加了以下功能&#xff1a; • …

TypeScript + Vue:类风格组件如何引领前端新潮流?

&#x1f680; TypeScript Vue&#xff1a;用类风格组件打造“假货比对”神器&#xff01;&#x1f31f; 2025 年&#xff0c;前端开发早已进入“类型安全 模块化”的黄金时代。TypeScript (TS) 的类风格组件正在席卷 Vue 社区&#xff0c;为开发者带来更优雅、更强大的编码体…

无人机+无人车+机器狼+DeepSeek:智能化设备集群技术详解

无人机、无人车、机器狼与DeepSeek的结合代表了智能化设备集群技术的重要发展方向。以下是对这一技术的详细解析&#xff1a; DeepSeek技术概述 DeepSeek是一种基于深度学习和数据挖掘技术的智能搜索与分析系统。它通过深度学习模型理解数据的上下文语义&#xff0c;实现更智…

Bash语言的语法

Bash语言的魅力&#xff1a;探秘命令行的力量 引言 在现代计算机科学的领域中&#xff0c;编程语言和脚本语言的使用已经变得不可或缺。每一种语言都有其独特的魅力和用武之地。在众多编程语言中&#xff0c;Bash&#xff08;Bourne Again SHell&#xff09;作为一种强大的脚…