C++ String类 ( 构造、拷贝构造、赋值运算符重载和析构函数)

class String

{

public:

//普通构造函数

String(const char *str = NULL)

{

if(str == NULL)

{

m_data = new char[1];

*m_data = ‘\0‘;

}

else

{

m_data = new char[strlen(str) + 1];

strcpy(m_data, str);

}

}

//拷贝构造函数

String(const String &s)

{

m_data = new char[strlen(s) + 1];

strcpy(m_data, s.m_data);

}

//赋值运算符重载

String & operator=(const String &s)

{

if(this == &s)

{

return *this;

}

delete [] m_data;

m_data = new char[strlen(s.m_data) + 1];

strcpy(m_data, s.m_data);

return *this;

}

//析构函数

~String()

{

if(m_data != NULL)

{

delete [] m_data;

m_data = NULL;

}

}

private:

char *m_data;

}

对于赋值运算符重载有三点要注意:

一、返回值应该为引用,目的是提高效率,不然返回值会生成一份临时拷贝。

二、参数应该为应用,原因如一。

三、参数定为const类型,防止在函数内部修改参数。

时间: 2024-08-10 06:34:36

C++ String类 ( 构造、拷贝构造、赋值运算符重载和析构函数)的相关文章

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载、!运算符重载、赋值运算符重载 、String类([]、 +、 += 运算符重载)、>>和<<运算符重载

C++ Primer 学习笔记_27_操作符重载与转换(2)--++/--运算符重载.!运算符重载.赋值运算符重载 .String类([]. +. += 运算符重载).>>和<<运算符重载 一.++/--运算符重载 1.前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 2.后置++运算符重载 成员函数的方式重载,原型为:

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

C++类的拷贝构造(Copy constructor)函数隐藏陷阱

好长时间没写C++了,今天写了个很简单的String类,竟然调试了半天,最终发现了一个十分隐蔽的陷阱,写出来供大家分享. C++中类的拷贝构造函数的作用就是通过类的一个对象来实例化另一个对象.下面是我写的一个MyString类,头文件MyString.h: #include <iostream> using namespace std; class MyString { public: MyString(); MyString(const MyString& str);//这里就是我们

引用参数与引用返回值 类的拷贝构造

引用地址  http://www.cnblogs.com/bigshow/archive/2008/11/10/1330514.html 经常看到这样的声明:T& func(T& t),这种声明和T func(T t)有什么区别?书上的解释是为了提高效率,究竟是如何提高效率的呢?内部执行了什么操作?本文通过8个小例子对引用参数和引用返回进行了一次彻底的排查.    首先看一下在类的成员函数中的引用参数和引用返回值: 类定义class A{     public:      int x; A

C/C++(C++拷贝构造器,赋值运算符重载)

拷贝构造器 由己存在的对象,创建新对象.也就是说新对象,不由构造器来构造,而是由拷贝构造器来完成.拷贝构造器的格式是固定的. class 类名 { 类名(const 类名 & another) 拷贝构造体 } class A { A(const A & another) {} } 规则: 1 系统提供默认的拷贝构造器.一经实现,不复存在. 2 系统提供的时等位拷贝,也就是所谓的浅浅的拷贝. 3 要实现深拷贝,必须要自定义. 4 浅拷贝,会导致内存重析构.linux下浅拷贝会挂机.doubl

数据结构之二叉树 (构造 拷贝构造 以及前序中序后续三种遍历方法)

首先二叉树的节点定义如下: struct BinaryNode {                  BinaryNode *_left;                  BinaryNode *_right;                  T _data;                 BinaryNode( T data ) :_data(data), _left( NULL), _right(NULL )                 {}; }; 二叉树的结构以及接口如下 te

模板类的拷贝构造函数和重载=

http://bbs.csdn.net/topics/190144045 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 5 6 using namespace std; 7 8 template <typename T,size_t size> 9 class fixed_vector 10 { 11 public: 12 typedef T* iterator; 13 typede

通过模板的特化实现 简单的类型萃取 实现memcppy时候对于特殊类型如string类的拷贝。

C++怎样识别一个对象的类型? typeid可以获取到一个类型的名称,但是不能拿来做变量的声明. [POD类型萃取] // // POD: plain old data 平凡类型(无关痛痒的类型)--基本类型 // 指在C++ 中与 C兼容的类型,可以按照 C 的方式处理. //#include<iostream> #include<string> using namespace std; struct __TrueType {  bool Get()  {   return tr

类的成员函数(构造、析构、拷贝构造、赋值、运算符重载)的实现

以String类为例实现其成员函数 class String { //友元函数重载运算符 friend ostream& operator<<(ostream &out,String& str); friend istream& operator>>(istream& in, String& str); public: //通用构造函数 String(const char* str) { if(!str) //对m_data加NULL