c++类的特殊成员函数
1.构造函数
函数名为类名,并且无返回值
可以有默认的构造函数
但是如果定义了非默认构造函数,就一定要写出默认构造函数(即使默认构造函数不做任何事情),除非非默认构造函数的所有参数都有默认值
2.析构函数
函数名为类名前面加~,并且无返回值,析构函数也没有参数。由系统在合适的时候调用。
可以有默认析构函数
如果构造函数里面用了new,析构函数里面要使用delete;构造函数里面用了new []。析构函数里面就要用delete[]
3.复制构造函数
Class_name(const Class_name &);
新建一个对象,并且将其初始化为同类现有对象时,复制狗仔函数将被调用。
StringBad ditto(motto);
StringBad ditto = motto;
StringBad ditto = StringBad(motto);
StringBad *pditto = new StringBad(motto);
4.赋值运算符
类的重载 类的自动转换与强制类型转换 转换函数
- 类的重载:可以通过成员函数进行重载,也可以通过友元函数进行重载
运算符重载:
格式:operatorop (argument list)
通过成员函数进行函数重载的例子: Time operator+ (const Time &t) const;
通过友元函数进行函数重载的例子: friend Time operator*(double t, const Time &t);
只能通过成员函数进行重载:
= 赋值运算符
() 函数调用运算符
[] 下标运算符
->通过指针访问类成员的运算符
- 类的自动转换与强制类型转换:
可以将类定义成与基本类型或者另一个类相关。使得从一个类型转换为另一种类型是有意义的。在这种情况下,程序员可以指示c++如果和自动进行转换,或者通过强制类型转换完成。
例子:
Stonewt::Stonewt(double lbs)
{
store = stn;
pds_left = lbs;
pounds = stn * Lbs_per_stn +lbs;
}
Stonewt myCat;
myCat = 19.6;
myCat = 19.6 使用Stonewt(double) 创建一个临时的Stonewt对象,并将19.6作为初始化值,然后采用逐成员复制方式将临时对象的内容复制到myCat中;这里使用的是隐式转换
只有接收一个参数的构造函数才能作为转换函数,如果构造函数有i两个参数。而第二个参数没有提供默认值,则它不可以用作转换函数
explicit Stonewt(double lbs) 关闭隐式转换,只能使用强制类型转换。
Stonewt myCat;
myCat = 19.6;//not valid
myCat = Stonewt(19,6);//valid
- 转换函数:
可以用类的自动转换或者强制类型转换把数字转换为Stonewt对象,也可以把Stonewt对象转换为double值。
构造函数只用于从某种类型到类类型的转换。要进行相反的转换。必须使用特殊的C++运算符函数--转换函数。
例如:
Stonewt wolfe(285.7);
double host = double(wolfe);
double host = wolfe;//implicit use of conversion function
最后一句语句中,编译器发现,右侧是Stonewt类型,而左侧是double类型,因此它将查看程序员是否定义了与此匹配的转换函数(如果没有找到这样的定义,编译器将生成错误消息,指出无法将Stonewt赋给double)
创建转换函数:operator typeName();
转换函数是类方法,不能指定返回类型,不能有参数。
例如:operator double() 可以在前面加explicit,这样就只能使用显示转换,避免错误。
5.地址运算符:
this