C++学习构造函数笔记

本博文源于C++语言学习,构造函数的用途非常广泛。构造函数一般需要1、构造函数名与类名相同;2、构造函数名前没有返回值类型声明。3、构造函数中不能通过return返回一个值。4、通常构造函数具有public属性。因此博文的主要学习模块分为:

1、系统提供的默认构造函数

一般自己不重载构造函数,那我们就一定使用默认构造函数,默认构造函数不会给变量初始化。标题下就以Car类作为模拟

在这里插入图片描述

#include<iostream>
using namespace std;

/*系统提供的默认构造函数*/

class Car{
    
    
public:
    void disp_mems_value();//显示变量信息
private:
    int m_nWheels;//车的轮子
    int m_nSeats;//车的座位
    int m_nLength;//车身长度

};

void Car::disp_mems_value()
{
    
    
    cout << "Wheels =" << m_nWheels << endl;
    cout << "Seats = " << m_nSeats << endl;
    cout << "Length = " << m_nLength << endl;
}

int main()
{
    
    
    Car mycar;
    mycar.disp_mems_value();//显示车参数
    system("pause");//屏幕暂停
    return 0;

}

代码中没有定义构造函数,采用了默认方式构造,结果运行效果会发现值不固定,如果我们在创建类的时候要进行初始化,那就需要自定义无参构造函数。

2、自定义无参构造函数

自定义无参构造函数是对默认构造函数的升级版,就是对值默认加以确定,因此下面一段代码将再次以Car为例子,进行自定义构造函数.

#include<iostream>
using namespace std;


class Car{
    
    
public:
    void disp_mems_value();
    Car(){
    
    //自定义无参构造。
        cout << "Car constructor!" << endl;
        m_nWheels = 4;
        m_nSeats = 2;
        m_nLength = 2;
    }
private:
    int m_nWheels;
    int m_nSeats;
    int m_nLength;

};

void Car::disp_mems_value()
{
    
    
    cout << "Wheels =" << m_nWheels << endl;
    cout << "Seats = " << m_nSeats << endl;
    cout << "Length = " << m_nLength << endl;
}

int main()
{
    
    
    Car mycar;
    mycar.disp_mems_value();
    system("pause");
    return 0;

}

在这里插入图片描述
这段代码与默认构造函数的唯一区别就是对private里面的变量进行了初始化,我们这句Car mycar;就是调用了自定义无参构造

3、自定义参数构造函数

当我们需要初始化参数,希望自己拟定的时候,我们就要自定义参数构造函数,这是一个最普通的操作,而C++在这里就花里护理呼哨一下,因为他有几个形式,这里进行列举一下,最后再以Car为例,再次模拟自定义参数构造函数
形式1

类名:构造函数名(参数列表):数据成员1:(参数1),数据成员2(参数2),...,数据成员n(参数n){
    
    
构造函数体
}

类名:构造函数名(类型擦桉树1=默认值,类型参数2=默认值)
#include<iostream>
using namespace std;


class Car{
    
    
public:
    void disp_mems_value();
    Car(int con_Seats,int con_Wheels,int con_Length=6):m_nWheels(con_Wheels),m_nSeats(con_Seats),m_nLength(con_Length){
    
    
        cout << "Car constructor!" << endl;
    }
private:
    int m_nWheels;
    int m_nSeats;
    int m_nLength;

};

void Car::disp_mems_value()
{
    
    
    cout << "Wheels =" << m_nWheels << endl;
    cout << "Seats = " << m_nSeats << endl;
    cout << "Length = " << m_nLength << endl;
}

int main()
{
    
    
    Car mycar(2,2);//其中一个参数进行默认参数
    mycar.disp_mems_value();
    system("pause");
    return 0;


在这里插入图片描述
这里的函数名,就比较C++风格,如果不特意学习C++其实根本看不懂,但是如果看见了这些形式后,就会深深地理解与加深.这次代码,主要实现了,main函数传入一个两个参数进行自定义参数构造的初始化

4、包含对象成员的类的构造函数

在类中的数据成员可以是其他类的对象,称这种成员是类的子对象或成员对象。下面代码用学生类和日期类来模拟包含对象成员的类的构造函数。理解一个学生有一个生日就是整段代码的核心在这里插入图片描述

#include<iostream>
#include<cstring>
using namespace std;

class Date{
    
    //定义日期类
public:
    Date(int y,int m,int d);//声明带参数的构造函数
    void show();
private:
    int m_nYear,m_nMonth,m_nDay;


};
Date::Date(int y,int m,int d)//定义Date类的构造函数
{
    
    
    cout << "Date constructor!" << endl;
    m_nYear = y;
    m_nMonth = m;
    m_nDay= d;
}

void Date::show(){
    
    //定义成员函数show()显示日期
    cout << m_nYear << "-" << m_nMonth << "-" << m_nDay;

}

class Student {
    
    //定义学生类
public:
//声明带参数的构造函数,con_name为学生姓名,con_id为学生id,y,m,d为日期信息
    Student(char *con_name,int con_id,int y,int m,int d);
    void disp_msg();
private:
    Date m_iBirthday; //Date类型的数据成员·
    char m_gName[20];
    int m_nID;
};
//定义Student类带参数构造函数,参数y,m,d用于对date类对象m_iBirthday初始化
Student::Student(char *con_name,int con_id,int y,int m,int d): m_iBirthday(y,m,d) {
    
    
    cout << "Student constructor!" << endl;
    strcpy_s(m_gName,strlen(con_name)+1,con_name);
    m_nID = con_id;
}
//定义成员函数disp_msg()显示学生信息
void Student::disp_msg() {
    
    
    cout << "std name:" << m_gName << ",id = " << m_nID << ",birthday:";
    m_iBirthday.show();
}

int main()
{
    
    
    Student student("xiaoming",1,1998,10,25);//调用带参数构造函数定义类对象
    student.disp_msg();
    return 0;


代码看起来有点长,在main函数中定义类对象时提供了五个参数,前三个出生日期,运行结果来看,先调用m-iBirthday的构造函数,然后再调用Student类的构造汗水》

5. 总结&读者收获

经过上面的学习,读者不仅可以收获构造函数四种的具体不同构造参数方式,也可以跟着代码一起运行,观察代码内部细节。有一些语法,只有敲了才会有感觉。

Guess you like

Origin blog.csdn.net/m0_37149062/article/details/121423907