数据成员多为私有的,要对他们进行初始化,必须用一个公有函数来进行。同时这个函数应该在定义对象时自动执行一次。称为构造函数。
构造函数的用途: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++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个。
#includeusing 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; }
运行结果如下:
成员初始化表:
#includeusing 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中的提示,实现构造函数
#includeusing 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中的提示,实现构造函数
#includeusing namespace std; const int len = 20; class CGoods { private: char Name[len]; int Amount; float Price; float Totle; public: CGoods() :Name{' '}, Amount{}, Price{}, Totle{} { } CGoods(const char *a, int b, float c) :Name{ ' '}, 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++编译器会自动给出一个缺省的析构函数。
如:~类型名(){ }
#includeusing namespace std; class Complex { int Real;//实部 int Image;//虚部 public: Complex() :Real{}, Image{} //缺省函数的构造 { cout << "creat object: " < 初始化:天生如此;赋值:后天改变
构建函数:获取资源; 析构函数:释放资源
析构函数没有形参。



