构造函数:是在创建对象时,用来给对象进行初始化的函数,即设定初始值,被称为构造函数:
声明为:
class 类名{
函数名();
};
构造函数的函数名,必须和类名相同,如果类中没有默认构造函数,则系统会自动创建一个构造函数。通过代码感受构造函数:
休闲鞋类的示例:
#include <iostream> using namespace std; class CShoes //声明类CShoes { public: CShoes(); //默认的构造函数CShoes() int getSize(); private: int size; }; CShoes::CShoes(){ //默认构造函数的实现 size=40; //初始化数据成员size } int CShoes::getSize(){ return size; } int main() { CShoes shoes; //定义一个CShoes的对象shoes; cout<<"鞋对象的初始尺码为:"<<shoes.getSize()<<endl; return 0; }
在定义CShoes类的对象shoes时,系统会自动调用默认构造函数(从代码中可以看到并没有调用构造函数),把对象的数据成员size设置为初始值40
现在想让这个休闲鞋类可以根据用户要求的大小和颜色,来创造休闲鞋对象,则给类的构造函数设定参数。一个类可以有多个构造函数,相当于是对默认构造函数的重载。
带参数的构造函数
声明:
class 类名
{
构造函数名(参数表);
};
通过例子来感受:适应新需求的休闲鞋类:
#include <iostream> #include <string.h> using namespace std; class CShoes { public: CShoes(); //默认构造函数 CShoes(int s,char *strColor); //带参数的构造函数 int getSize(); char *getColor(); private: int size; char color[10]; }; CShoes::CShoes(){ size=40; strcpy(color,"红色"); } CShoes::CShoes(int s,char *strColor) { strcpy(color,strColor); size = s; } int CShoes::getSize(){ return size; } char *CShoes::getColor(){ return color; } int main() { CShoes shoes1; //定义一个CShoes的对象shoes; CShoes shoes2(38,"白色"); //根据参数个数调用构造函数 cout<<"鞋对象的初始尺码为:"<<shoes1.getSize()<<"颜色为:"<<shoes1.getColor()<<endl; cout<<"鞋对象的初始尺码为:"<<shoes2.getSize()<<"颜色为:"<<shoes2.getColor()<<endl; return 0; }
带默认参数的构造函数
CShoes(int s,char *strColor="白色");
对象“克隆”---拷贝构造函数
需求出来后,需要大规模生产,如果对每一个进行定做,很浪费时间,所以为了节约成本,就需要根据已经创造好的对象,来创造新的对象。
拷贝构造函数的作用:在初始化时调用来将一个已知对象的数据成员的值,拷贝给正在创建的另一个同类的对象。
格式为:
class 类名{
拷贝构造函数名(const 类名 &引用名);
};
拷贝构造函数不指定返回类型,并且只有一个参数,是对某个对象的引用;函数名同类名相同,参数表中的const是后面引用的对象在函数中,不能被修改。如果类中没有声明拷贝构造函数,则编译系统会自动生成拷贝构造函数。
通过例子感受
#include <iostream> #include <string.h> using namespace std; class CShoes { public: CShoes(); //默认构造函数 CShoes(int s,char *strColor); //带参数的构造函数 CShoes(const CShoes &s); //拷贝构造函数 int getSize(); char *getColor(); private: int size; char color[10]; }; CShoes::CShoes(){ size=40; strcpy(color,"红色"); } CShoes::CShoes(int s,char *strColor) { strcpy(color,strColor); size = s; } CShoes::CShoes(const CShoes &s){ //拷贝构造函数的实现 strcpy(color,s.color); size=s.size; } int CShoes::getSize(){ return size; } char *CShoes::getColor(){ return color; } int main() { CShoes shoes1; //定义一个CShoes的对象shoes; CShoes shoes2(38,"白色"); //根据参数个数调用构造函数 CShoes shoes3(shoes2); //用shoes2对象来初始化shoes3,shoes3对象完全是对shoes2对象的克隆 cout<<"鞋对象的初始尺码为:"<<shoes1.getSize()<<"颜色为:"<<shoes1.getColor()<<endl; cout<<"鞋对象的初始尺码为:"<<shoes2.getSize()<<"颜色为:"<<shoes2.getColor()<<endl; cout<<"鞋对象的初始尺码为:"<<shoes3.getSize()<<"颜色为:"<<shoes3.getColor()<<endl; return 0; }
实质:用一个已知对象来初始化另一个对象
一般在3种情况下使用:
1、明确表示用一个对象来初始化另一个对象时;
2、当对象作为函数的实参传递给形参时,需要调用拷贝构造函数;
3、当对象作为函数返回值时,需要调用拷贝函数。
析构函数
清理对象垃圾,在对象被删除前,做一些清理对象所占用的内存的工作,功能是:释放一个对象。
声明格式:
class 类名
{
~析构函数名();
};
与构造函数的两个不同:
1、一个类中只能有一个析构函数,不像构造函数可以被重载;
2、析构函数一般被系统自动调用,但也可以主动调用,对于构造函数是不能被主动调用的。
如果一个函数中没有析构函数,则编译系统会自动生成一个默认的析构函数,这个默认的析构函数是一个空函数。
类中的常类型
常对象:由类定义的常类型的对象
类名 const对象名
const 类名 对象名
定义完后,要进行初始化,完后就不能再修改了,否则会产生编译错误
常成员函数:
作用:提供给常对象进行调用,如果不是常成员函数,常对象调用就会产生编译错误。
声明格式为:
数据类型 函数名(参数表)const;
通过一个例子来感受常对象和常成员函数:
#include <iostream> #include <string.h> using namespace std; class CConstant { public: CConstant(int x,int y); void disp(); void disp() const; private: int m_x; int m_y; }; CConstant::CConstant(int x,int y){ m_x=x; m_y=y; } void CConstant::disp() { cout<<"x="<<m_x<<"***y="<<m_y<<endl; } void CConstant::disp() const { cout<<"x="<<m_x<<"$$$y="<<m_y<<endl; } int main() { CConstant t1(5,10); const CConstant t2(8,30); t1.disp(); t2.disp(); //通过常对象来调用常成员函数 return 0; }
常成员函数的重载也可以通过函数返回值类型来进行,如在CConstant类中有两个同名的成员函数disp,其就是根据函数返回值类型不同,而进行的函数重载。第一个是void类型,第二个是void加上const类型。
常成员数据
类中常成员数据的初始化,只能通过成员初始化列表的方式来进行,通过一个程序来看:
#include <iostream> #include <string.h> using namespace std; class CConstant { public: CConstant(int n); void disp(); private: const int& rNum; //常数据成员 const int nNum; //常数据成员 }; CConstant::CConstant(int n):nNum(n),rNum(nNum){ //通过初始化列表来初始化常数据成员 } void CConstant::disp() { cout<<nNum<<":"<<rNum<<endl; } int main() { CConstant t1(25),t2(88); t1.disp(); t2.disp(); //通过常对象来调用常成员函数 return 0; }
数据成员初始化列表的方式初始化数据成员:
CConstant::CConstant(int n):nNum(n),rNum(nNum){
}其是先用形参n的值初始化nNum,然后是用rNum对nNum进行引用,相当于:
nNum=n;
rNum=&nNum