本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:
- 基础篇:类与对象(涉及C++的三大特性等);
- STL 篇:学习使用 C++ 提供的 STL 相关库;
- 高阶数据结构与算法篇: 手动实现自己的 STL 库 及 设计实现高阶数据结构,如 B树、B+树、红黑树等。
学习集:
- C++ 入门到入土!!!学习合集
- Linux 从命令到网络再到内核!学习合集
本期内容:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)
目录:
1. 基本成员函数及作用
2. 构造函数
- - 2.1 特性
3. 构造函数的定义与调用
- - 3.1 基本的定义与调用(无参构造与有参构造)
- - 3.1 函数参数缺省与构造函数
4. 默认构造函数
5. 类类型成员与构造函数
6. 相关文章推荐
【 C++学习合集链接 】
1. 基本成员函数及作用
class A{ };
如上代码是一个空类!(不显示实现任何成员)
实际上,任何类在什么都不写时,编译器会自动生成 6 个默认成员函数。
默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。
- 初始化和清理:
构造函数:主要完成初始化工作!
析构函数:主要完成清理工作!
- 拷贝复制:
- 拷贝构造函数:是使用同类对象初始化创建对象!
- 复制重载函数:只要是把一个对象复制给另一个对象!
- 取地址与重载:主要是普通对象 和 const 对象取地址,这俩很少自己实现!
2. 构造函数
构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用(不开空间),以保证每个数据成员都有 一个合适的初始值, 在对象整个生命周期内只调用一次。
2.1 特性
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象,而是初始化对象!
特性:
- 函数名与类名相同!
- 无返回值,且不需要写 void !
- 对象的实例化时编译器自动调用对应的构造函数!
- 构造函数支持重载!
- 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
- 实例化类时,若不传递参数,不用在对象名后添加括号!(若添加了就成了函数声明)【代码示例,看下面的代码示例 main 函数处说明!】
3 构造函数的定义与调用
3.1 基本的定义与调用(无参构造与有参构造)
关注以下代码!
#include<iostream>
using std::cout;
using std::endl;
class Date{
public:
/* 注意:若不写构造函数,编译器会默认自动生成一个无参的默认构造函数!!! */
/* 构造函数的函数名与类名相同! */
/* 设计无参构造函数 */
Date(){}
/* 设含参构造函数:由于构造函数支持重载,故可写如下三种! */
Date(int year){ // 只初始化 年!
_year = year;
}
Date(int year, int month){
_year = year;
_month = month;
}
Date(int year, int month, int day){
_year = year;
_month = month;
_day = day;
}
private:
int _year;
int _month;
int _day;
};
int main(){
Date d1; // 无传参,调用无参构造函数!
Date d2(2023); // 调用单参形参函数!
Date d3(2023,5); // 调用双参形参函数!
Date d4(2023,5,22); // 调用三参形参函数!
// 注意:如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明
// 以下代码的函数:声明了d5函数,该函数无参,返回一个日期类型的对象
// warning C4930: “Date d5(void)”: 未调用原型函数(是否是有意用变量定义的?)
Date d5();
return 0;
}
3.2 函数参数缺省与构造函数
如上代码中存在部分问题!
如:不传递 或 传递一个 或 两个 参数进行实例化时,会出现值的未初始化!若打印可能导致程序崩溃!
(如下图)连续写四个构造函数,使得代码看起来赘余!此时可考虑使用参数缺省进行优化!
代码如下:
#include<iostream>
using std::cout;
using std::endl;
class Date{
public:
Date(int year = 1970, 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(){
Date d1; // 无传参,调用无参构造函数!
Date d2(2023); // 调用单参形参函数!
Date d3(2023,5); // 调用双参形参函数!
Date d4(2023,5,22); // 调用三参形参函数!
d1.Print();
d2.Print();
d3.Print();
d4.Print();
return 0;
}
4. 关于默认构造函数
默认构造函数(三类:最好不要同时存在!会产生调用歧义(二义性)!):
- 我们不写构造函数,编译器自动生成的!
- 我们自己写的全缺省的构造函数!
- 我们自己写的,无参构造函数!
5. 相关文章推荐
1. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题