本博文源于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. 总结&读者收获
经过上面的学习,读者不仅可以收获构造函数四种的具体不同构造参数方式,也可以跟着代码一起运行,观察代码内部细节。有一些语法,只有敲了才会有感觉。