您的位置:首页 > 其它

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

2011-08-26 16:47 197 查看
读《高质量程序设计指南》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 ©)

{

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; ////赋值函数,两者都已经定义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: