一.构造函数的初步了解
在类实例化的过程中,我们会定义一些成员变量以及一些成员函数,而构造函数就是一个特殊的成员函数。构造函数只会在对象的生命周期内调用一次。
构造函数的形式为:
class 类名
{
类名(构造形参表)
{
//主要负责对象的初始化,即初始化成员变量
}
从中可以看出构造函数的两个特点:
·无返回值
·函数名与类名相同
#include<iostream>
using namespace std;
class BOOK
{
private:
string m_name;
double m_price;
int m_num;
public:
void print()
{
cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
}
BOOK(const string name, const double price, const int num)
{
m_name = name;
m_price = price;
m_num = num;
}
};
int main()
{
BOOK a("乱世书",10.0,5);
a.print();
return 0;
}
以上是一个构造函数的基本应用。
二.构造函数的重载
在定义一个类的时候,定义多个构造函数不会出错,只要注意参数的不同就可以。
这是也反映了一个构造函数的特点:
·若是多个构造函数,编译器会自动调用相应的构造函数
#include<iostream>
using namespace std;
class BOOK
{
private:
string m_name;
double m_price;
int m_num;
public:
void print()
{
cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
}
BOOK(const string name, const double price, const int num)
{
cout << "调用BOOK1函数" << endl;
m_name = name;
m_price = price;
m_num = num;
}
BOOK(const double price)
{
cout << "调用BOOK2函数" << endl;
m_name = "剑来";
m_price = price;
m_num = 6;
}
BOOK(const string name )
{
cout << "调用BOOK3函数" << endl;
m_name = name;
m_price = 9.0;
m_num = 8;
}
};
int main()
{
BOOK a1("乱世书",10.0,5);
a1.print();
BOOK a2(8.0);
a2.print();
BOOK a3("遮天");
a3.print();
return 0;
}
在类定义的时候,只要输入对应的参数,编译器就可以调用对应的构造函数。
接下来介绍构造函数的另一个特点:
·如果一个类中没有显示声明的构造函数,那么编译器会自动生成一个无参构造函数,自动生成 的构造函数,函数体为空且没有参数。 但是如果程序员写了至少一个构造函数,那么编译器就不会生成了。
这个无参构造函数还有以下两点:
·对于基本类型的成员变量不能初始
·对于类类型的成员变量,会自动调用相应类的无参构造函数来初始化
#include<cstdio>
#include<iostream>
using namespace std;
class A
{
public:
A(void) //无参构造函数
{
m_i = 1234;
}
int m_i;
};
class B
{
public:
B(void) {}
int m_j;
A m_a;
string str;
};
int main()
{
B b;
cout << b.m_a.m_i << endl;//1234
return 0;
}
如果已经定义了有参构造函数,那么编译器就不会生成无参构造函数,此时如果没有定义无参构造函数,并且定义的类中有一个类类型的成员变量,就需要初始化表进行初始化。
其格式如下:
class 类名 { 类名(形参表):成员变量(初值),...{//构造函数体} };
#include<iostream>
using namespace std;
class BOOK
{
private:
string m_name;
double m_price;
int m_num;
public:
void print()
{
cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
}
BOOK(const string name, const double price, const int num):m_name(name),m_price(price), m_num(num){} 初始化表
};
int main()
{
BOOK a1("乱世书",10.0,5);
a1.print();
return 0;
}
一般来说构造函数与初始化表是一样的,只有在两个情况下必须使用初始化表;
·如果有类类型的成员变量,而该类又没有无参构造函数,则必须通过初始化表来初始化该变量
·如果类中包含"const"或"引用"型的成员变量,必须要使用初始化表来初始化。
其中第二点,一个是初始化后不能修改,所以不能在构造函数中初始化,一个则是因为在被定义时必须要初始化。
在定义构造函数的时候,我们可以使用缺省实参
#include<iostream>
using namespace std;
class BOOK
{
private:
string m_name;
double m_price;
int m_num;
public:
void print()
{
cout << "名字:" << m_name << " 价格:" << m_price << " 数量:" << m_num << endl;
}
BOOK(const string name, const double price, const int num = 10)
{
m_name = name;
m_price = price;
m_num = num;
}
};
int main()
{
BOOK a1("乱世书",10.0);
a1.print();
return 0;
}
综上所述构造函数的作用和特点如下:
作用:专门用于对象的初始化工作,在类的对象创建时定义初始状态
特点:
·无返回值
·函数名与类名相同
·若是多个构造函数,编译器会自动调用相应的构造函数
·如果一个类中没有显示声明的构造函数,那么编译器会自动生成一个无参构造函数,自动生成 的构造函数,函数体为空且没有参数。 但是如果程序员写了至少一个构造函数,那么编译器就不会生成了。