赋值和初始化不同以及安全拷贝
2012-09-24 19:49
232 查看
String 类的原型如下
class String
{
public:
String(const char *str=NULL); //构造函数
String(const String &other); //拷贝构造函数
~String(void); //析构函数
String& operator=(const String &other); //等号操作符重载
ShowString();
private:
char *m_data; //指针
};
String::~String()
{
delete [] m_data; //析构函数,释放地址空间
}
String::String(const char *str)
{
if (str==NULL)//当初始化串不存在的时候,为m_data申请一个空间存放'\0';
{
m_data=new char[1];
*m_data='\0';
}
else//当初始化串存在的时候,为m_data申请同样大小的空间存放该串;
{
int length=strlen(str);
m_data=new char[length+1];
strcpy(m_data,str);
}
}
String::String(const String &other)//拷贝构造函数,功能与构造函数类似。
{
int length=strlen(other.m_data);
m_data=new [length+1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &other)
{
if (this==&other)//当地址相同时,直接返回;
return *this;
int length= strlen (other.m_data);
char *tmp = strcpy(new char[length+1],other.m_data);
delete [] m_data;//当地址不相同时,删除原来申请的空间,重新开始构造;
m_data = tmp;
return *this;
}
String::ShowString()//由于m_data是私有成员,对象只能通过public成员函数来访问;
{
cout<<this->m_data<<endl;
}
main()
{
String AD;
char * p="ABCDE";
String B(p);
AD.ShowString();
AD=B;
AD.ShowString();
}
class String
{
public:
String(const char *str=NULL); //构造函数
String(const String &other); //拷贝构造函数
~String(void); //析构函数
String& operator=(const String &other); //等号操作符重载
ShowString();
private:
char *m_data; //指针
};
String::~String()
{
delete [] m_data; //析构函数,释放地址空间
}
String::String(const char *str)
{
if (str==NULL)//当初始化串不存在的时候,为m_data申请一个空间存放'\0';
{
m_data=new char[1];
*m_data='\0';
}
else//当初始化串存在的时候,为m_data申请同样大小的空间存放该串;
{
int length=strlen(str);
m_data=new char[length+1];
strcpy(m_data,str);
}
}
String::String(const String &other)//拷贝构造函数,功能与构造函数类似。
{
int length=strlen(other.m_data);
m_data=new [length+1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &other)
{
if (this==&other)//当地址相同时,直接返回;
return *this;
int length= strlen (other.m_data);
char *tmp = strcpy(new char[length+1],other.m_data);
delete [] m_data;//当地址不相同时,删除原来申请的空间,重新开始构造;
m_data = tmp;
return *this;
}
String::ShowString()//由于m_data是私有成员,对象只能通过public成员函数来访问;
{
cout<<this->m_data<<endl;
}
main()
{
String AD;
char * p="ABCDE";
String B(p);
AD.ShowString();
AD=B;
AD.ShowString();
}
相关文章推荐
- C++中string和char的区别以及直接初始化和拷贝初始化
- C++构造函数的初始化列表和函数体内赋值有什么不同?
- C++ 初始化和赋值的不同
- OC中实例变量初始化方法,setter方法以及便利构造器的不同
- C++二叉树之构造拷贝赋值,递归和非递归的前序遍历,中序遍历和后序遍历,以及层序遍历
- C++类成员冒号初始化以及构造函数内赋值
- C++ 拷贝、复制、赋值 、初始化的理解
- Windows和Linux以及不同Linux系统之间的文件互传(文件拷贝)
- 赋值、浅拷贝以及深拷贝的区别
- 窗口不同初始化以及单次实例化的方案
- 自己建立一个结构体类型,里面有结构体的浅拷贝以及赋值;调用函数排序,void main5避免野指针
- C++类成员冒号初始化以及构造函数内赋值
- [C++]类成员冒号初始化以及构造函数内赋值
- C++类成员冒号初始化以及构造函数内赋值
- Oracle集合(联合数组(索引表),嵌套表,变长数组,记录类型的嵌套表)的初始化与赋值,以及它们的区别
- 动态申请 二维数组 以及初始化、 赋值
- C++中的拷贝构造函数和拷贝赋值操作符+const成员变量初始化(5)---《Effective C++》
- ”C++中赋值和初始化不同“实例说明---欢迎大家发表自己的看法
- C语言中sizeof对数组和对指针操作的不同,以及sizeof中表达式赋值问题
- Python引用传递、赋值规则以及深拷贝和浅拷贝