字符串类的深拷贝(2种)和浅拷贝(3种)

#include<iostream>
using namespace std;
//深拷贝:
//class String
//{
//public:
//	//缺省构造
//	String(char *string="")
//		:_str(new char[strlen(string)+1])
//	{
//		strcpy(_str, string);
//	}
//	//如果不写拷贝构造函数或赋值构造函数,系统默认值拷贝,为浅拷贝
//	//初始化列表,如果不写,如果是基本类型,则初始化为随机值,自定义类型则调构造函数
//	String(const String& s)
//		:_str(new char[strlen(s._str)+1])
//	{
//		strcpy(_str, s._str);
//	}
//
//	String&   operator = (const String& s)
//	{
//		if(this!=&s)
//      {
//	      delete[] _str;//不会为空,无需判断,字符串最少“”
//		  _str = new char[strlen(s._str) + 1];
//		  strcpy(_str, s._str);
//		 }
//		return *this;
//	}
//	~String()
//	{
//		delete[] _str;
//	}
//	void Display()
//	{
//		cout << _str << endl;
//	}
//private:
//	char* _str;
//};
//class  String
//{
//	//通过调用默认构造函数写拷贝构造和赋值操作符重载
//public:
//	String(char* string = "")
//		:_string(new char[strlen(string) + 1])
//	{
//		strcpy(_string, string);
//	}
//	String(String& s)
//		:_string(NULL)//需设置指针为空,否则销毁时指针随机值会崩毁
//	{
//		String tmp(s._string);
//		//利用tmp出作用域调析构函数,销毁开辟内存,本函数不需要
//		swap(_string, s._string);//必须两个操作数类型一致,所以形参参数不应const
//	}
//	String& operator=(String s)//利用拷贝构造赋值
//	{
//      //不需要判断this==&s,此处是拷贝构造s,地址肯定不同
//		swap(_string, s._string);
//		return *this;
//		//利用s析构函数销毁*this原来开辟的_string指针的指向
//	}
////  String& operator=(const String& s)
////  {
////	if (this != &s)
////	{
////		String tmp(s);
////		swap(_string, tmp._string);
////	}
////	return *this;
////	}
////}
//两种方式赋值操作符重载
//	~String()
//	{
//		if (_string)
//			delete[] _string;
//	}
//	void Display()
//	{
//		cout << _string << endl;
//	}
//private:
//	char* _string;
//};

//浅拷贝
//class String
//{
//	//静态变量,此方法只限制拷贝构造对象所指指针一处
//public:
//	String(char* string = "")
//		:_string(new char[strlen(string) + 1])
//	{
//		sCount = 1;
//		strcpy(_string, string);
//	}
//	String(const String& s)
//		:_string(s._string)//初始化列表不能是静态变量
//	{
//		sCount = ++sCount;
//	}
//	String& operator=(const String& s)
//	{
//		//只能面对一个相同成员指针才可用,无需定义赋值重载
//	}
//	~String()
//	{
//		if (--sCount == 0)
//		{
//			delete[] _string;
//		}
//		//cout << sCount << endl;
//	}
//	void Display()
//	{
//		cout << _string << endl;
//		//cout << sCount << endl;
//	}
//private:
//	char* _string;
//	static int  sCount;
//};
//int String::sCount = 0;
//class String
//{
//	//每个对象定义一个存储所指同一个指针的对象个数
//public:
//	String(char* string="")
//		:_string(new char[strlen(string)+1]),
//		sCount(new int(1))
//	{
//		strcpy(_string, string);
//	}
//	String(const String& s)
//		:_string(s._string),
//		sCount(s.sCount)
//	{
//		++(*sCount);
//	}
//	String& operator=(const String& s)
//	{
//		if (this != &s)
//		{
//			Delete(*this);
//			_string = s._string;
//			sCount = s.sCount;
//			++(*sCount);
//		}
//		return *this;
//	}
//	void Delete(String& s)
//	{
//		if (--(*s.sCount) == 0)
//		{
//			delete sCount;
//			delete[] _string;
//		}
//	}
//	~String()
//	{
//		Delete(*this);
//	}
//	void Display()
//	{
//		cout << _string << endl;
//	}
//private:
//	char* _string;
//	int *sCount;
//};
//class String
//{
//	//给前面多开辟4个字节存储所指同一个成员指针的对象
//public:
//	String(char* str = "")
//		:_str(new char[strlen(str) + 5])
//	{
//		*((int *)_str) = 1;
//		_str = _str + 4;
//		strcpy(_str, str);
//	}
//	String(const String& s)
//		:_str(s._str)
//	{
//		++(*((int *)(_str-4)));
//	}
//	String& operator=(const String& s)
//	{
//		if (this != &s)
//		{
//            Delete(*this);
//			_str = s._str;
//			++(*((int *)(_str-4)));
//		}
//		return  *this;
//	}
//	~String()
//	{
//		cout << *((int*)(_str - 4)) << endl;
//		Delete(*this);
//     
//	}
//	void Delete(String& s)
//	{
//		if (--(*(int *)(_str-4))== 0)
//		{
//			_str -= 4;
//			delete[]  _str;
//		}
//	}
//	void Display()
//	{
//		cout << _str << endl;
//		cout << *(int*)(_str - 4) << endl;
//
//	}
//private:
//	char* _str;
//};
void Test1()
{

	String s1("abcdef");
	s1.Display();
	String s2(s1);
	s2.Display();
	String s3("abc");
	s3.Display();
	s3 = s1;
	s3.Display();
}
int main()
{
	Test1();
	system("pause");
	return 0;
}
时间: 2024-11-03 03:40:34

字符串类的深拷贝(2种)和浅拷贝(3种)的相关文章

C++ 类的深拷贝和浅拷贝完美解决

//类的深拷贝和浅拷贝 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class Point{ public: Point(int _a,int _b,const char *pin/*in*/){ x = _a; y = _b; remark = (char *)malloc(sizeof(char)*(strlen(pin) + 1)); strcpy(remark, pin); cout &

第十一课、Qt中的字符串类

一.历史遗留的问题及解决方案 1.遗留的问题 (1).C语言不支持真正意义上的字符串 (2).C语言用字符数组和一组函数实现字符串操作 (3).C语言不支持自定义类型,因此无法获得字符串类型 2.解决方案 (1).从c到c++进化过程中引入了自定义类型 (2).在c++中可以通过类来完成字符串的定义 3.标准库STL (1).STL是意义上需要与c++一同发布的标准库 (2).STL是一套以模板技术完成的c++类库 (3).STL包含了常用的算法和数据结构 (4).STL包含了字符串类 4.Qt

字符串类的定义和字符串类对象的创建方式

String为字符串类. 其定义如下: public final class String 可以看出,String类是final类型的,是不可继承的.从源代码还可以看出,String从本质上说就是一个char类型的数组. 字符串类对象的声明有两种方式. 第一种,使用new关键字创建. String 变量名=new String("值"); 第二种,直接声明并初始化. String 变量名="值"; 我更喜欢第一种,标准的,所有类的对象的声明都通过  new 类的构造

(十)常用类库----数值类、字符串类

类库:包含一堆类的方法和常量,便于我们直接调用 (1)数值类Numeric 基类Numeric包含两个子类Integer(整数)和Float(浮点数) 其中Integer(整数)又可以分为两个子类Fixnum(普通整数)和Bignum(大整数) 记住整数和浮点数就行,普通整数和大整数则系统会自动转换 #类型转换puts 1.2.to_iputs 1puts 1.to_fputs "3.2gg".to_iputs "4.55sss".to_f puts 1.5.rou

Java中的深拷贝(深复制)和浅拷贝(浅复制)

深拷贝(深复制)和浅拷贝(浅复制)是两个比较通用的概念,尤其在C++语言中,若不弄懂,则会在delete的时候出问题,但是我们在这幸好用的是Java.虽然java自动管理对象的回收,但对于深拷贝(深复制)和浅拷贝(浅复制),我们还是要给予足够的重视,因为有时这两个概念往往会给我们带来不小的困惑. 浅拷贝是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象.深拷贝不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象.举例来说更加清楚:对象A1中包含对B1的引用

JAVA字符串类

一.字符串类String1.String是一个类,位于java.lang包中2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名=new String("值");3.字符串的常用方法 3.1 字符串长度--length() 3.2 判断值是否相等 equals() 3.3 判断字符串对象地址是否相同 == 3.4 忽略 大小写 判断 equalsIgnoreCase() 3.5 大小写转换 toLowerCase()--小写 to

自己编写的Windows字符串类 封装字符串格式转换和常用操作 方便使用

最近开发的语音识别的项目经常碰到转码的问题,各种宽窄字节转换,ASNI, UTF8, 宽字节 --  代码写得冗长,繁琐,维护性太差了.决定自己写一个能直接使用各种编码的字符串类,于是实现了一个,功能不多,但是也够用.由于string 和 wstring 在多线程下共享数据会出问题,这里只用最基础的char 和 wchar_t. 基于Windows平台,代码如下 /* ************************************************** Title: 自定义字符串

Java:字符串类String的功能介绍

在java中,字符串是一个比较常用的类,因为代码中基本上处理的很多数据都是字符串类型的,因此,掌握字符串类的具体用法显得很重要了. 它的主要功能有如下几种:获取.判断.转换.替换.切割.字串的获取.大小写转换.去除空格.比较等 下面的演示都在StringTest类中进行 class StringTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[

第九周 程序阅读-字符串类的设计

阅读下面的程序,领会其中用到的设计方案.技术手段与算法. /* 对于要定义的字符串类CMyString, 数据成员包括: - 字符串的长度: - 指向字符串第一个字符的指针 成员函数包括: - 不带参数的构造函数: - 带一个类型为const char *类型的参数(用于对字符串初始化)的构造函数: - 带一个const CMyString&类型的复制构造参数: - 析构函数: - Strlen函数 (用于求字符串的长度): - int Find(char c) (找出字符c在本字符串中第一次出