数据成员多为私有的,要对他们进行初始化,必须用一个公有函数来进行。同时这个函数应该在定义对象时自动执行一次。称为构造函数。
构造函数的用途:1)创建对象;2)初始化对象中的属性;3)类型转换
c语言:有空间即可操作
C++:有空间不一定能够操作,必须调动构造函数,来创建对象:有空间不一定有对象,有对象一定有空间;
类型名+(a,b):调动构造函数, 如 :int c1(1,2)
类型名+{a,b}:调动构造函数, 如:int c2{1,2}
类型名+{}:调动无实参的构造函数, 如:int c3{}
构造函数是特殊的公有成员函数(在特殊用途中构造函数的访问限定可以定义成私有或者保护)。其特征如下:
1.函数名与类型名相同。
2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可以写成void。实际上构造函数有返回值,返回的就是构造函数所创建的对象;
3.在程序运行时,当新的对象被建立,该对象所属的类构造函数自动被调用,在该对象生存期间也只调用这一次。
4.构造函数可以重载。严格地讲,类中可以定义多个构造函数,他们由不同的参数表区分,系统在自动调用时按照一般函数重载的规则原则一个执行。
5.构造函数可以在类中定义,也可以在类中声明,在类外定义;
6.如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数。
类名(void){ }
但是只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。
#include
using namespace std;
class Complex
{
int Real;//实部
int Image;//虚部
public:
Complex() //缺省函数的构造
{
Real = 0.0;
Image = 0.0;
cout << "creat object:Complex()" << endl;
}
Complex(int r, int i) //带参数的构造函数
{
Real = r;
Image = i;
cout<< "creat object:Complex(int ,int)" << endl;
}
void print()
{
cout << "Real= " << Real << 't' << "Image= " << Image << endl;
}
};
int main()
{
Complex ca;
Complex cb(1, 2);
Complex cc = Complex(3, 4);
Complex cd{ 5,6 };
Complex ce();//是否可以构造对象
return 0;
}
运行结果如下:
成员初始化表:
#include
using namespace std;
class Complex
{
int Real;//实部
int Image;//虚部
public:
Complex() :Real{}, Image{} //缺省函数的构造
{
cout << "creat object:Complex()" << endl;
}
Complex(int r, int i) :Real{ r }, Image{i} //带参数的构造函数
{
cout<< "creat object:Complex(int ,int)" << endl;
}
void print() const //常方法
{
cout << "Real= " << Real << '\t' << "Image= " << Image << endl;
}
};
int main()
{
Complex ca;
Complex cb(1, 2);
Complex cc = Complex(3, 4);
Complex cd{ 5,6 };
Complex ce();//是否可以构造对象
return 0;
}
练习:
1. 根据main中的提示,实现构造函数
#include
using namespace std;
class CDate
{
private:
int year;
int month;
int day;
public:
CDate() :year{1}, month{1}, day{1}
CDate(int a,int b,int c) :year{a}, month{b}, day{c}
{
}
void Print()
{
cout << "year" << year << endl;
cout << "month" << month << endl;
cout << "day" << day << endl;
}
};
int main()
{
CDate c1;
CDate car(2022, 5, 22);
c1.Print();
car.Print();
return 0;
}
运行结果:
2. 根据main中的提示,实现构造函数
#include
using namespace std;
const int len = 20;
class CGoods
{
private:
char Name[len];
int Amount;
float Price;
float Totle;
public:
CGoods() :Name{'\0'}, Amount{}, Price{}, Totle{}
{
}
CGoods(const char *a, int b, float c) :Name{ '\0'}, Amount{b}, Price{c}, Totle{b * c}
{
strcpy_s(Name, len, a);
}
void Print()
{
cout << "Name" << Name << endl;
cout << "Amount" << Amount << endl;
cout << "Price" << Price << endl;
cout << "Totle" << Totle << endl;
}
};
运行结果:
当定义一个对象时,C++自动调用构造函数建立该对象并进行初始化,那么当一个对象的生命周期结束时,C++也会自动调用一个函数注销该对象并进行善后工作,这个特殊的成员函数即析构函数:
1. 函数名与类型名相同,但是需要在前面加‘~’,如:~CGoods()。
2. 析构函数无函数返回类型,与构造函数在这一方面是一样的,但析构函数不带任何参数。
3.一个类有一个也只有一个析构函数,这与构造函数不同。
4.对象注销时,系统自动调用析构函数。
4. 如果类说明中没有给出析构函数,则C++编译器会自动给出一个缺省的析构函数。
如:~类型名(){ }
#include
using namespace std;
class Complex
{
int Real;//实部
int Image;//虚部
public:
Complex() :Real{}, Image{} //缺省函数的构造
{
cout << "creat object: " <
初始化:天生如此;赋值:后天改变
构建函数:获取资源; 析构函数:释放资源
析构函数没有形参。