带指针的类,必须要自己写拷贝构造和赋值构造
拷贝构造:参数和类的类型一样的构造函数
赋值构造:重写操作符=,且其参数和类的类型一样

class String
{public:
String(const char* cstr = 0);
String(const String& str);
String& operator=(const String& str);
~String();
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
1

传入字符指针,构建字符的长度,将数据拷贝进m_data中。
当没有传入字符指针时,将m_data置为‘\0’。

inline
String::String(const char* cstr = 0)
{if (cstr) {m_data = new char[strlen(cstr)+1];
strcpy(m_data, cstr);
}
else { //  未指定初值
m_data = new char[1];
*m_data = '\0';
}
}

拷贝构造的具体实现方式:将str中的数据拷贝进m_data中。

inline
String::String(const String& str)
{m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
}

赋值构造的具体实现方式:首先检测自我赋值,若不进行检测的话,当是自我赋值的时候,将内存释放,则赋值和被赋值的指针都会释放,使得最后不能构造成功。
若不是自我赋值,则释放m_data的内存,并将str的数据复制到m_data中

inline
String& String::operator=(const String& str)
{if (this == &str)  //注意自我赋值return *this;delete[] m_data;
m_data = new char[ strlen(str.m_data) + 1 ];
strcpy(m_data, str.m_data);
return *this;

析构函数的实现:释放指针指向的内存

inline
String::~String()
{delete[] m_data;
}

MyString.h文件如下:
此处将类的声明和实现写在了一块

#ifndef __MYSTRING__
#define __MYSTRING__#include<iostream>
#include<cstring>
using namespace std;class MyString {public:MyString(const char* );MyString(const MyString & str);MyString& operator =(const MyString& str);~MyString();char* get_c_str() const { return m_data; }private:char* m_data;
};
MyString::MyString(const char* cstr = 0) {if (cstr) {m_data = new char[strlen(cstr)+1];strcpy(m_data,cstr);}else {m_data = new char[1];*m_data = '\0';}
}
MyString::MyString(const MyString & str) {m_data = new char[strlen(str.get_c_str())+1];strcpy(m_data,str.get_c_str());
}MyString& MyString::operator =(const MyString& str) {if (this == &str)return *this;delete[]m_data;m_data = new char[strlen(str.get_c_str()) + 1];strcpy(m_data, str.get_c_str());return *this;
}
MyString::~MyString() {delete[]m_data;
}ostream& operator <<(ostream& os, const MyString& str) {return os << "我的string:"<<str.get_c_str() << endl;
}
#endif

测试文件如下:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>#include "MyString.h"
#include<cstring>
using namespace std;void main() {MyString s1 = "hello";MyString s2=s1;MyString s3(s1);cout << "s1:"<<s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;
}

输出结果如下:

c++面向对象高级编程 学习二 带指针的类相关推荐

  1. c++面向对象高级编程 学习一 不带指针的类

    复数类 complex 是一个不带指针的类,其声明如下: class complex {public: complex(double r=0,double i=0):re(r),im(i){} com ...

  2. c++面向对象高级编程 学习十二 模板

    模板特化: 模板是一种泛化的形式,特化是将参数类型进行指定,写出特化的版本,当在调用下图cout<<hash()(1000);的时候,由于特化中有struct hash{ }的版本,因此会 ...

  3. c++面向对象高级编程 学习十六 vptr和vtbl

    当一个类中有一个或多个虚函数时,内存中会多一个虚指针(vptr,virtual pointer),指向一个虚表(vtbl,virtual table) 父类有虚函数,则子类一定有虚函数 在下图示意图中 ...

  4. c++面向对象高级编程 学习十四 引用

    文章目录 reference reference的常见用途 reference 变量有三种形式:值,指针,引用 int x=0; //值 int* p=&x;//指向整型的指针,地址,指针在之 ...

  5. c++面向对象高级编程 学习九 pointer-like classes

    c++的class设计出来有两种形式,一种像指针,一种像函数 智能指针里包含普通指针,要写 * 和 -> 的函数 sp->method(); //sp-> 经 T* operator ...

  6. c++面向对象高级编程 学习五 组合、委托与继承

    组合 composition 表示has a queue类中有一个deque容器,这种关系叫做 组合 queue中的六个函数都是调用c的函数完成的 template <class T> c ...

  7. c++面向对象高级编程 学习四 静态、类模板、函数模板

    静态static:静态数据和静态函数,在内存中只有一份,不会随着创建对象的数目的增加而增加 static数据:比如银行的account类中,账户名是普通数据,100个对象会有100个账户名,但利率都是 ...

  8. c++面向对象高级编程 学习十七 const, new, delete

    文章目录 常量成员函数 new和delete 常量成员函数 常量成员函数是不改变成员数据. 当成员函数的const和non-const版本同时存在时,const object只能调用const版本,n ...

  9. c++面向对象高级编程 学习十五 组合继承关系下的构造和析构

    文章目录 继承关系 组合关系 继承和组合 继承关系 构造由内而外,析构由外而内,内即是父类 组合关系 A拥有B, 构造由内而外,析构由外而内,内即是B 继承和组合 构造和析构顺序如图:

最新文章

  1. 在Linux中打印函数调用堆栈【原创】
  2. CDN中,字体文件的跨域问题和解决
  3. python搭建自动化测试平台_如何用python语言搭建自动化测试环境
  4. html限制最多字符串,css – 设置字符串换行中允许的最大换行量
  5. 移动端触屏网页的触摸事件
  6. Docker+Jenkins+Gitlab+Django应用部署实践
  7. Shader 坐标转换
  8. Win10 20H2正式发布,对比旧版新功能一览
  9. Intellij IDE 必知配置
  10. Python实现中英文分词
  11. MVC中将list转化成json 并处理时间格式
  12. 网络安全基础(木马、概述、冰河木马实验)
  13. 经济机器是如何运行的?
  14. java用jaxb三步解析xml_三步解决JAXB生成XML包含CDATA问题
  15. Rockchip RK3588 kernel dts解析之系统休眠配置rockchip_suspend
  16. 5G技术在广播电视中的应用方式
  17. 这10个实用网站/app,至少让你的效率翻一倍!
  18. 【docker lnmp】 2、容器mysql 连接问题 getaddrinfo failed
  19. 人工神经网络与深度神经网络
  20. Proteus电路图绘制与CubeMX生成框架下填充Keil 5代码的联调仿真

热门文章

  1. mysql行级锁作用_Mysql事务及行级锁的理解
  2. android 蒙版图片带拖动_推荐一个好用小巧的Android引导蒙版(浮层)库
  3. linux mysql密码转义_linux忘记mysql密码处理方法
  4. opencv获取图片像素坐标_利用OpenCV从图片中提取矩形并标注坐标(室内平面地图)(一)
  5. 华中科技大学文华学院 CSDN 高校俱乐部成立啦!
  6. CCIE-LAB-SDN-第四篇-SD-WAN-2
  7. 【HDU - 1272】小希的迷宫 (并查集判环)
  8. 【ZOJ - 2724】【HDU - 1509】Windows Message Queue(优先队列)
  9. 打印机显示发送任务到服务器失败,G-FAX单机版操作指引-AOFAX—传真服务器.DOC
  10. java获取u盘_实例分享java监听u盘的方法