读《高质量程序设计指南》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; 赋值函数,两者都已经定义