一.构造函数
1.1构造函数的作用
构造函数的作用有3个:
- 创建对象
- 为对象初始化
- 类型转换
1.2构造函数的特点
-
1.函数名与类名相同。
-
2.构造函数无函数返回类型说明。注意是没有而不是void,即什么也不写,也不可写void!实际上构造函数有返回值,返回的就是构造函数所创建的对象
-
3.在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也只调用这一次。
-
4.构造函数和普通成员函数一样,可以重载。严格地讲,说明中可以有多个构造函数,它们由不同的参数列表区分,系统在自动调用时按一般函数重载的规则选一个执行。
-
5.构造函数和普通成员函数一样,可以在类中定义,也可以在类外定义。
-
6.如果类说明中没有给出构造函数,则C++编译器自动给出一个缺省的构造函数: 类名(void) {}。这个缺省的构造函数的功能只是为了创建对象,因为其函数体为空,所以只能创建对象,而不能为其初始化。但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。
只要构造函数是无参的或者只要各参数均有缺省值的,C++编译器都认为是缺省的构造函数,并且缺省的构造函数只能有一个 。
如果对象的数据成员全为公有的,也可以在对象名后加“=”加“{}”,在花括号中顺序填入全体数据成员的初始值.
例1:说明第6个特点
#include<iostream>
using namespace std;
class Text
{
public:
Text() //相当于系统产生的,缺省构造函数
{
cout<<"缺省构造函数被调用了"<<endl;
}
Text(int d = 0)//缺省构造函数
{
cout<<"带有默认参数值的构造函数被调用了"<<endl;
data = d;
}
Text(int x, int y)
{
this->x = x;
this->y = y;
cout<<"带有2个参数的构造函数被调用了"<<endl;
}
private:
int data;
int x;
int y;
};
main()
{
Text t1;//错误
Text t2(2);
Text t3(1, 2);
}
上述代码在编译时会出现错误:
error C2668: ‘Text::Text’ : ambiguous call to overloaded functio->错误C2668: ‘Text::Text’:对重载函数的模糊调用
原因是:Text()和Text(int data = 0)这2个构造函数是构不成重载的,c++编译器都将他们视为缺省的构造函数。所以在执行Text t1;时,c++编译器不知道调用哪一个构造函数。
解决方法:
将Text(int data = 0)改为->ext(int data);
----------------------------------------------------------------------------------------------------------------例2:
#include<iostream>
using namespace std;
class Text
{
public:
Text(int x, int y)
{
this->x = x;
this->y = y;
cout<<"带有2个参数的构造函数被调用了"<<endl;
}
private:
int data;
int x;
int y;
};
main()
{
Text t1;
}
程序会报错,原因是但只要我们定义了一个构造函数,系统就不会自动生成缺省的构造函数。所以这时c++编译器找不到对应的构造函数创建对象。
二.析构函数
2.1析构函数的特点
- 构函数名与类名相同,但在前面加上字符‘’,如CGoods()。
- 析构函数无函数返回类型,与构造函数在这方面是一样的。但析构函数不带任何参
数。 - 一个类有一个也只有一个析构函数,这与构造函数不同。析构函数可以缺省。
- 对象注销时,系统自动调用析构函数。