现在的位置: 首页 > 综合 > 正文

C++新特性(构造函数/析构函数/常类型)

2013年06月13日 ⁄ 综合 ⁄ 共 3913字 ⁄ 字号 评论关闭

构造函数:是在创建对象时,用来给对象进行初始化的函数,即设定初始值,被称为构造函数:

声明为:

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

抱歉!评论已关闭.