副标题#e#
结构函数和析构函数是类的两个非凡的成员函数
1.结构函数
结构函数(constructor)是类的一个非凡的成员函数,它与类名同名。当界说该类的工具时,结构函数将被系统自动挪用用以实现对该工具的初始化。
结构函数不能有返回值,因而不能指定包罗void在内的任何返回值范例。
结构函数的界说与其他成员函数的界说一样可以放在类内或类外。
结构函数的界说名目为:
类名(形参说明)
{函数体}
结构函数既可以界说成有参函数,也可以界说成无参函数,要按照问题的需要来定。
留意:措施中不能直接挪用结构函数,结构函数是在建设工具时由系统直接挪用的,因此,在结构函数中一般完成初始化类成员变量的操纵。
2.结构函数的重载
一个类中呈现了两个以上的同名的成员函数时,称为类的成员函数的重载。
在类的成员函数的重载中,较量常见形式是结构函数的重载,当类中呈现了重载结构函数时,C++语言将按照结构函数中的参数个数和范例选择符合的结构函数来完成工具的结构。
3.默认结构函数与缺省参数的结构函数
假如在类中没有显示界说结构函数,则编译系统会为该类提供一个默认的结构函数,该默认结构函数是一个无参函数,函数体为空,它仅仅认真建设工具,而不做任何初始化事情(即不给相应的数据成员赋初值),所以在该类的工具建设时不能担保有一个确定的初始状态。
精采的编程习惯应该是给类提供符合的完成初始化事情的结构函数。
可是,只要一个类界说了一个结构函数(不必然是无参结构函数),编译系统就不再提供默认的结构函数。
当结构函数具有缺省参数时,称为具有缺省参数的结构函数,在利用具有缺省参数的结构函数时,要防备二义性。
4.拷贝结构函数
拷贝结构函数是一种非凡的结构函数。界说拷贝结构函数的一般名目为:
类名::类名(const 类名 &形式参数)
{ 函数体 }
拷贝结构函数的函数名与类名同名。该函数也没有返回值。
拷贝结构函数的成果是通过将一个同类工具的值拷贝给一个新工具,来完成对新工具的初始化,即用一个工具去结构别的一个工具。
假如在类的界说中没有界说拷贝结构函数,则编译系统将自动生成一个具有上述形式的默认的拷贝结构函数,作为该类的公有成员。
#p#副标题#e#
5.析构函数
与结构函数对应的是析构函数。当一个工具被界说时,系统会自动挪用结构函数为该工具分派相应的资源,当工具利用完毕后且在工具消失前,系统会自动挪用类的析构函数来释放这些系统资源。
析构函数也是类的一个非凡的成员函数,其函数名称是在类名的前面加上“~”;它没有返回值,也没有参数。一个类中只能拥有一个析构函数,所以析构函数不能重载。
析构函数的界说方法为:
~类名()
{ 函数体 }
假如措施员在界说类时没有为类提供析构函数,则系统会自动建设一个默认的析构函数,其形式为:
~类名()
{ }
工具被析构的顺序与其建设时的顺序正好相反,即最后结构的工具最先被析构。
假如一个工具是被new运算符动态建设的,当利用delete运算符释放它时,delete将会自动挪用析构函数。
6.一个类的工具作为另一个类的数据成员
当一个类中的数据成员是某一个类的工具时,可称这种成员是新建类的子工具或工具成员,则新类的界说名目可暗示为:
calss X
{
类名1 成员名1;
类名2 成员名2;
类名3 成员名3;
……………
类名n 成员名n;
….………… //其他成员
};
个中,X为新建类的类名,类名1、类名2、……、类名n必需是已界说过的类。如:
class A {};
class B
{
A a;
};
则在建设类B的工具(挪用类B的结构函数)时,会自动挪用类A的结构函数。假如类A的结构函数为有参函数时,凡是回收初始化表的方法来挪用结构函数。
新类的结构函数的一般界说名目为:
新类(参数表0):成员1(参数表1),成员2(参数表2),…,成员n(参数表n)
{ …….. }
个中,成员1、成员2、……、成员n是新类中的工具成员;参数表1提供初始化成员1所需的参数,参数表2提供初始化成员2所需的参数,依此类推,而且这几个参数表中的参数均来自参数表0.别的,初始化新类的非工具成员所需的参数,也由参数表0提供。
7.常工具与常工具成员
(1)常工具
常工具是指工具常量,其界说名目为:
const 类名 工具名;
从名目中可以看出,常工具的界说与一般工具的界说对比,在类名前必需加const要害字。
常工具具有以下特点:
l 常工具在界说时必需举办初始化,并且在措施中不能再对其举办更新。
l 通过常工具只能挪用类中的常成员函数,而不能挪用类中的其他成员函数。
(2)常工具成员
常工具成员分为常成员函数和常数据成员。
1)常成员函数
在类中,利用要害字const说明的成员函数成为常成员函数,常成员函数的说明名目为:
范例 函数名(形参表) const;
类中的常成员函数与普通成员函数对比,具有以下特点:
#p#分页标题#e#
l 常成员函数为类的只读函数,这种成员函数可以读取数据成员的值,但不行以更新数据成员的值,它也不能挪用该类中没有const修饰的其他成员函数。
l 常成员函数界说中的const要害字是函数范例的一部门,因此在其实现部门中也要带上const要害字。
l 常成员函数界说中的const要害字可以参加区分重载函数。
譬喻:
#include <iostream.h>
class Test_const{
private:
int m;
public:
Test_const(int arg1) //结构函数
{
m=arg1;
}
void setvalue(int newvalue);
void showvalue();
void showvalue() const; //常成员函数
};
void Test_const::setvalue(int newvalue)
{
m=newvalue;
}
void Test_const::showvalue()
{
cout<<"m="<<m<<endl ;
}
void Test_const::showvalue() const //此处的const要害字不行少
{
cout<<"const example m="<<m<<endl ;
}
void main()
{
Test_const c1(100); //界说工具c1
const Test_const c2(100); //界说常工具c2
c1.setvalue(200);
c1.showvalue(); //此处挪用的是函数void showvalue();
c2.showvalue(); //此处挪用的是函数void showvalue() const;
//不能执行语句c2.setvalue(200);因为常工具c2只能挪用常成员函数
}
2)常数据成员
类中界说的数据成员,除了可觉得一般变量外,还可觉得const常量,这种数据成员称为常数据成员。
结构函数可以对工具的数据成员举办初始化,但假如数据成员为常量成员或引用成员时,则不能在结构函数中直接用赋值语句为其举办赋值。需要操作结构函数所附带的初始化表举办初始化,即在结构函数的括号后头加上“:”和初始化表,其名目为:
类名::类名(形参表):常数据成员名1(值1),常数据成员名2(值2),……
{
//结构函数的函数体
}
可以看出,当有多个数据成员时,初始化表中的初始化项有多个,且需要用逗号离隔。
8.类浸染域
类浸染域又可称为类域,它是指在类界说顶用一对大括号开括起来的范畴。
差异的类的成员函数可以具有沟通的名字,因此,需要用浸染域运算符“::”来指明该成员函数所属的类。
在类的成员函数中可以直接引用类的数据成员。可是,假如在成员函数中界说了同名的局部变量时,则必需用浸染域运算符“::”来指定,以免杂乱。譬喻:
#include <iostream.h>
class Region{
private:
int x;
int y;
public:
Region(int x,int y)
{
Region::x=x;
Region::y=y;
}
void print()
{
cout<<"x="<<x<<",y="<<y<<endl ;
}
};
void main()
{
Region region(5,10);
Region *p;
p=®ion;
region.print();
p->print();
}
假如要从类外会见类的成员,则必需通过工具名和圆点成员选择符“.”或指向工具的指针和箭头成员选择符“->”。如上例中的语句region.print()和语句p->print();是等价的。