类的构造、析构、拷贝、赋值函数
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; ////赋值函数,两者都已经定义
一般情况下,对于任意一个类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; ////赋值函数,两者都已经定义
相关文章推荐
- 编写string类的构造、拷贝构造、析构、拷贝赋值函数
- 用汇编的眼光看C++(之class构造、析构) ,(之拷贝、赋值函数)
- C++基础:四大基本函数,构造,析构,拷贝构造,赋值函数
- 【深度探索C++对象模型读书笔记】【第5章】构造、析构、拷贝语意学
- 实现一个string类,包括构造、析构、拷贝构造及operator= 函数
- 深度探索C++对象模型 第五章 构造、析构、拷贝语意学
- 构造、拷贝构造、析构
- 类 构造 析构函数 调用顺序/ 复制(拷贝)构造&&赋值函数
- 简单的String类(构造、拷贝构造、赋值构造、析构等)
- 赋值函数与拷贝构造的差异
- 深入探索C++对象模型之五 --- 析构、构造、拷贝语意学
- 深度探索C++对象模型(五)构造、析构、拷贝语意学
- object构造、拷贝构造、析构、临时对象
- C++对象模型 ch5 构造 析构 拷贝语义学
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(中)
- [读书笔记] 深入探索C++对象模型-第五章-构造、析构、拷贝语义学(下)
- 程序员面试宝典随笔记(一)---构造拷贝构造和赋值函数的细则
- 类中嵌套另一个类时,调用构造,析构,拷贝,赋值运算符等函数的次序
- 构造、析构、拷贝语意学
- 字符串类的构造函数,拷贝构造,赋值函数的实现