构造函数和析构函数
构造函数是一个与类同名的特殊的公有成员函数。
创建类对象时构造函数会被调用,且只调用一次/
构造函数无返回类型。
· 默认构造函数格式:
类名(){.......}
Account(){ //无返回类型,无参数ID = 0; //缺省IDstrcpy(Name,""); //缺省账户名balance = 0.0; //缺省余额
}
· 带参数的构造函数。其格式如下:
类名(形式参数表){.......}
Account(int ID,char Name[],float balance){this->ID = ID;strcpy(this->Name,Name);this->balance = balance;
}
//这个构造函数的内容和 Qt图形界面编程入门(3) 中Inital函数完全相同
· 拷贝构造函数
类名(类名 &c)
这里第一个类名是函数名,第二个类名是说明引用变量c的类型
Account(Account &other){ID = other.ID; //为什么可访问other的私有成员?strcpy(Name,other.Name);balance = other.balance;
}
//拷贝构造函数,就是创建一个现有对象的副本
//C++规定,在类的成员函数中,不仅仅可利用“对象.变量名”的形式访问自身所有的数据成员,也可以访问同一个类的其他对象的所有数据成员
在Account的拷贝构造函数中使用引用类型是因为如果使用普通的类对象做参数,那么该函数调用时会反复不停的创建参数表里的局部对象,引发死循环。
函数重载与构造函数
函数重载是C++的专有概念。
在传统C语言中要定义在两个整数,三个整数,两个实数或者若干整数中求最大值的函数,可定义如下:
int Max2(int, int);// 返回两个整数中最大值
int Max3(int, int ,int); //返回三个整数中最大值
//返回两数中最大值
double MaxD2(double, double);
//返回数组A前n个元素的最大值
int MaxArray(int A[],int n);
在C++中则可以定义为:
int Max(int,int); //返回两个整数中最大值
int Max(int, int, int); //返回三个整数中最大值
//返回两个实数中的最大值
double Max(double,double);
//返回数组A前n个元素的最大值
int Max(int A[],int n);
函数重载是指相同的作用域中的函数名称相同,而参数不同的多个函数并存的现象。
于是在账户类中可能程序下面三个构造函数
Account();
Account(int ID,char Name[], float balance);
Account(Account &other);
如何调用构造函数
int main(){char name[20] = "Jack";// ..........Account a1; //构造函数a1.Initial(10112,name,600.0);Account a2(a1); //调用拷贝构造函数Account a3 //调用默认构造函数
}
构造函数只在对象创建时调用且仅仅调用一次
此后再不能通过“对象.函数名(参数)”的形式调用
对象数组如何调用构造函数
Account C[3];
C[0] = Account(10101,name,500.0);
C[1] = Account(10102,name,1600.0);
C[2] = Account(10103,name,900.0);
//也可以写成下面形式:
Account C[3] =
{
Account(10101,name,500.0),
Account(10102,name,1600.0),
Account(10103,name,900.0)
};
动态对象如何调用构造函数
Account *pA;
//动态创建1个对象,调用默认构造函数
pA = new Account;Account *pA,*pB;
//调用带参的构造函数
pA = new Account(10001,name,500.0);
//调用拷贝构造函数
pB = new Account(*pA);
析构函数的定义和作用
· 析构函数函数名与类名相同,紧贴再名称前面用波浪号~与构造函数进行区分,例如:
~Point();
· 构造函数没有返回类型,也不能指定参数,因为析构函数只能有一个,不能被重载;
· 当对象被撤销时析构函数被自动调用,与构造函数不同的是,析构函数可以被显式调用,以释放对象中动态申请的内存。
构造函数的初始化列表
初始化列表是构造函数特有的初始化变量的方式,被访者构造函数形式参数表最后的)后边,函数体起始位置的{前面
类的静态成员
用关键字static修饰的数据成员叫做静态数据成员:
class MyClass{int x;static int count; //static 放在某种类型之前
};
MyClass MemberX,MemberY;
MyClass::m_nCount = 0;
静态成员函数只能直接访问类中的静态成员变量
所有非静态成员函数均可直接访问静态和非静态的数据成员
静态成员为类的所有对象所共享