类的构造、析构、拷贝、赋值函数

读《高质量程序设计指南》chapter 14总结

一般情况下,对于任意一个类A,如果不显示的声明和定义,会自动生成默认的4个public inline函数

class A

{

A();                              //构造函数,可自定义多个

~A();                            ///析构函数,只有一个

A(const A&);                /拷贝构造函数,按位拷贝。用已经创建的对象来初始化正在定义的对象

A& operator=(const A& a);  /赋值函数,按位拷贝。用已经创建的对象来给已经定义的对象赋值

}

1,初始化和赋值的区别:初始化是在创建对象时使用初始值直接填充对象的内存单元,因此不会有数据类型转换,也不会产生临时对象。而赋值是对象创造后任何时候都可以调用,但由于使用“=”运算符,会有类型转换和产生临时对象。

2,构造函数分为默认的构造函数,拷贝构造函数,其它带参数的构造函数。

拷贝构造函数的第一个参数是本类对象的引用,const引用等。并且没有其它参数,或者其它参数都有默认值。

3,以string类为例来说明上面四个默认函数。

class string

{

  public:

      string(const char *str=NULL);

      string(const string & copy);

      ~string();

      string & operator =(string &other);

  private:

      size_t m_size;

      char *m_data;

}

string::string(const char *str=NULL)

{

       if(str==NULL)

              {

                  m_data=new char[1];

                  *m_data='\0';

                  m_size=0;

              }

       else{

                 int length=strlen(str);

                 m_data=new char[length+1];

                 strcpy(m_data,str);

                 m_size=length;

}

string::~string()

{

            delete [ ] m_data;

            m_data=NULL;

}

string::string(const string &copy)

{

       size_t len=strlen(copy.m_data);

       m_data=new char[len+1];

       strcpy(m_data,copy.m_data);

       m_size=len;

}

string & string::operator=(const string &other)

{

       if(this!=&other)   //检查自定义

          {

              delete [] m_data;

              int len=strlen(other.m_data);

              m_data=new char[len+1];

                            strcpy(m_data,other.m_data);

               m_size=len;

          }

          return *this;

}

4,拷贝构造函数和赋值函数的区别;

若有

         string a("Hello");          拷贝构造函数

         string b("World");         ///拷贝构造函数

         string c=a;                  拷贝构造函数,相当于c(a);给定义的对象c初始化a。易混淆。

         c=b;                            赋值函数,两者都已经定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值