C++写实拷贝

 /*********************
    WZ  ASUST
写实拷贝
注意每一个重载的操作
修改一个对象的操作均需要构造空间
S[2]=‘S‘怎样传参数
*********************/

#include"sts.h"
 class String
{
public:
     String(char *str = "")
      :_str(new char[strlen(str) + 5])
     {
          *(int *)_str = 1;
          _str += 4;
          strcpy(_str, str);
     }
     ~String()
     {
          if (_str != NULL)
          {
              _clear();
          }
     }
     String(const String& str)
     {
          _str = str._str;
          ++_GetRefCount();
     }
     String& operator=(const String& str)
     {
          if (this != &str)
          {
               _clear();
               _str = str._str;
               ++ _GetRefCount();
          }
          return *this;
     }
     char& operator[](int index)//写时拷贝
     {
 
          if (_GetRefCount()>1)//当引用次数大于1时新开辟内存空间
          {
               --_GetRefCount();//原来得空间引用计数器减1
               char *str = new char[strlen(_str) + 5];
               strcpy(str+4, _str);
               _str = str+4;
               _GetRefCount()++;
          }
          return _str[index];
     }
     friend ostream& operator<<(ostream& output, const String& str)
     {
          output << str._str<<endl;
          return output;
     }
 
private:
     int& _GetRefCount()
     {
          return *(int *)(_str - 4);
     }
     void _clear()
     {
          if (--_GetRefCount() == 0)
          {
               delete[] (_str-4);
          }
     }
private:
     char *_str;
};

int main()
{
String s1("123");
String s2(s1);
String s3("1234");
cout<<s1;
cout<<s2;
s2=s3;
cout<<s2;
cout<<s3;
return 0;
}
时间: 2024-08-13 23:25:43

C++写实拷贝的相关文章

python核心编程--笔记

python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗余输出(导入语句详细追踪) 1.5 –m mod 将一个模块以脚本形式运行 1.6 –Q opt 除法选项(参阅文档) 1.7 –c cmd 运行以命令行字符串心事提交的python脚本 1.8 file   以给定的文件运行python脚本 2 _在解释器中表示最后

子进程

1.fork()函数     include<unistd.h> 一个现有进程可以调用fork函数穿件一个新进程,子进程返回0,父进程返回子进程ID,出错返回-1 子进程是父进程的副本,子进程获得父进程的数据空间.堆和栈的副本,父子进程不共享这些空间.父子进程共享正文段.对于子进程,现在很多实现并不执行父进程的数据段.栈和堆的完全复制,而是使用写时拷贝技术,这些区域由父子进程共享,而且内核将他们的访问权限变为只读.若父子进程中任意个试图修改这些区域,则内核只为修改区域的那块内存制作一个副本.

关于vfork的一个问题

为什么vfork的子进程里面用return,整个程序会挂掉,而exit()不会. 首先我们来看一下,出现挂掉的代码:  #include<stdio.h>  #include<stdlib.h>  #include<unistd.h>    int main()  {      int var;      var = 88;      if((pid = vfork()) < 0)      {          printf("error vfork&

关于shared_ptr

首先了解shared_ptr毫无疑问的是智能指针的一种,智能指针是为了解决在大型代码里无法不好控制指针的问题,例如:在类里面如果出现了动态开辟出来的空间,有一个指针指向这块空间,如果在相应的作用范围之内没有将其delete掉会造成内存的泄漏,所以这样就必须手动的对这一块空间进行释放,但是这非常不利于我们的工作,所以我们就引入了智能指针,它是一个类,它的作用范围结束就自动释放了,所以这样达到了智能的管理这一块空间.所以shared_ptr也自然地拥有了上面的特性和功能,现在就对shared_ptr

关于string的一些心得体会

要写string的函数,首先就是创建一个string的类,在实现string类的过程中一直不断优化,以减少代码量和考虑不周的问题,首先我先给出刚开始的经典写法 经典解法(初级程序员适用) class String { public: String(const char *str = ""):       //构造函数 _str(new char[strlen(_str)+1]) { strcpy(_str, str); } String(const String &str)  

c++中string类的基本功能的实现(1)

1.传统的实现string类的方法 优点:程序简单易懂 缺点: 1)在实现其拷贝构造和赋值的操作时多次的调用new动态的开辟空间,因此也需要多次的通过delete来释放空间.如果处理不当还容易造成内存泄漏. 2)程序的一致性比较差 #include <iostream> #include <string> using namespace std; class String  { public: // 构造函数 String(char *str = "") :_s

linux线程的实现

http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用的资源就是内核栈和上下文切换时保存寄存器的空间.支持多线程的内核叫做多线程内核(Multi-Threads kernel ). 轻量级进程 轻量级线程(LWP)是一种由内核支持的用户线程.它是基于内核线程的高级

几种典型的服务器网络编程模型归纳(select poll epoll)

1.同步阻塞迭代模型 同步阻塞迭代模型是最简单的一种IO模型. 其核心代码如下: bind(srvfd); listen(srvfd); for(;;) { clifd = accept(srvfd,...); //开始接受客户端来的连接 read(clifd,buf,...); //从客户端读取数据 dosomthingonbuf(buf); write(clifd,buf)//发送数据到客户端 } 上面的程序存在如下一些弊端: 1)如果没有客户端的连接请求,进程会阻塞在accept系统调用处

cJSON序列化工具解读一(结构剖析)

cJSON简介 JSON基本信息 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.易于人阅读和编写.同时易于机器解析和生成.是一种很好地数据交换语言. 官方信息解读简介 JSON构建:基于两种结构 “名称/值”对 的集合. 值得有序列表. JSON具体结构表示 对象:一个”名称/值"对的集合  {名称:值,名称:值} 数组:值得有序集合[值,值] 值:str,num,true,false,null,object,array.可嵌套 字符串:由双引号包围