C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)

本系列 C++ 相关文章 仅为笔者学习笔记记录,用自己的理解记录学习!C++ 学习系列将分为三个阶段:基础篇、STL 篇、高阶数据结构与算法篇,相关重点内容如下:

  1. 基础篇类与对象(涉及C++的三大特性等);
  2. STL 篇学习使用 C++ 提供的 STL 相关库
  3. 高阶数据结构与算法篇手动实现自己的 STL 库设计实现高阶数据结构,如 B树、B+树、红黑树等。

学习集:

  • C++ 入门到入土!!!学习合集
  • Linux 从命令到网络再到内核!学习合集

本期内容:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)


目录:
1. 基本成员函数及作用
2. 构造函数
- - 2.1 特性
3. 构造函数的定义与调用
- - 3.1 基本的定义与调用(无参构造与有参构造)
- - 3.1 函数参数缺省与构造函数
4. 默认构造函数
5. 类类型成员与构造函数
6. 相关文章推荐


【 C++学习合集链接 】


1. 基本成员函数及作用

class A{ };

如上代码是一个空类!(不显示实现任何成员)

实际上,任何类在什么都不写时,编译器会自动生成 6 个默认成员函数。

默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。

  1. 初始化和清理
  • 构造函数:主要完成初始化工作!

  • 析构函数:主要完成清理工作!

  1. 拷贝复制
  • 拷贝构造函数:是使用同类对象初始化创建对象!
  • 复制重载函数:只要是把一个对象复制给另一个对象!
  1. 取地址与重载:主要是普通对象 和 const 对象取地址,这俩很少自己实现!

2. 构造函数

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用(不开空间),以保证每个数据成员都有 一个合适的初始值, 在对象整个生命周期内只调用一次。


2.1 特性

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


特性:

  1. 函数名与类名相同!
  2. 无返回值,且不需要写 void !
  3. 对象的实例化时编译器自动调用对应的构造函数!
  4. 构造函数支持重载!
  5. 如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。
  6. 实例化类时,若不传递参数,不用在对象名后添加括号!(若添加了就成了函数声明)【代码示例,看下面的代码示例 main 函数处说明!】

3 构造函数的定义与调用

3.1 基本的定义与调用(无参构造与有参构造)

关注以下代码!

#include
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 函数参数缺省与构造函数

如上代码中存在部分问题!

如:不传递 或 传递一个 或 两个 参数进行实例化时,会出现值的未初始化!若打印可能导致程序崩溃!

(如下图)连续写四个构造函数,使得代码看起来赘余!此时可考虑使用参数缺省进行优化!

C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)_第1张图片

代码如下:

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

C++ 学习 ::【基础篇:12】:C++ 类的基本成员函数:构造函数基本的定义与调用 |(无参构造与有参构造及缺省参数式构造)_第2张图片


4. 关于默认构造函数

默认构造函数(三类:最好不要同时存在!会产生调用歧义(二义性)!):

  • 我们不写构造函数,编译器自动生成的!
  • 我们自己写的全缺省的构造函数!
  • 我们自己写的,无参构造函数!

5. 相关文章推荐

1. C++ 学习 ::【基础篇:13】:类的基本成员函数:类类型成员与构造函数问题

你可能感兴趣的:(C++,基础篇学习合集,c++,学习,开发语言,笔记)