c++类的特殊成员函数

2018-01-18  本文已影响0人  i_Eloise

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.赋值运算符

类的重载 类的自动转换与强制类型转换 转换函数

只能通过成员函数进行重载:
= 赋值运算符
() 函数调用运算符
[] 下标运算符
->通过指针访问类成员的运算符

可以将类定义成与基本类型或者另一个类相关。使得从一个类型转换为另一种类型是有意义的。在这种情况下,程序员可以指示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 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

上一篇下一篇

猜你喜欢

热点阅读