我是靠谱客的博主 着急西牛,最近开发中收集的这篇文章主要介绍c++ 学习笔记--class String(02)class String,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

class String

Notes

  • class with pointer
  • 字符串指针动态分配,‘’结束标记
  • 三个特殊函数
    • 拷贝构造
      • 成员变量是字符串指针,默认构造只拷贝了地址,即两个对象指向了同一地址。一方面指向同一地址就很危险,另一方面造成内存泄漏,为浅拷贝
      • 深拷贝,重新new内存,拷贝字符串内容,新的对象指向新的地址
    • 拷贝赋值
      • 传入string对象,判断被赋值对象与传入(赋值)对象是否一致,
        • 一致则返回this,效率提高,不自检删除自己后不能进行深拷贝
        • 不一致则清理被赋值对象,深拷贝传入(赋值)对象
    • 析构函数
      • 释放对象内存

代码示例

https://gitee.com/NiMiKiss/learning-notes.git

#ifndef __CLASS_STRING__
#define __CLASS_STRING__
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
class String
{
public:
String(const char* cstr = nullptr);
String(const String& str);
String& operator=(const String& str);
~String();
char* get_c_str() const { return m_data; }
private:
char* m_data;
};
inline
String::String(const char* cstr)
{
if (cstr) {
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else {
m_data = new char[1];
*m_data = '';
}
}
inline
String::~String()
{
delete[] 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(const String& str)
{
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
std::ostream&
operator<<(std::ostream& os, const String& str)
{
os << str.get_c_str();
return os;
}
#endif //! __CLASS_STRING__

客户端调用

#include "Class_String.h"
#include <iostream>
int main()
{
String s1("hello");
String s2("world");
String s3(s2);
std::cout << s3 << std::endl;
s3 = s1;
std::cout << s3 << std::endl;
std::cout << s2 << std::endl;
std::cout << s1 << std::endl;
}

最后

以上就是着急西牛为你收集整理的c++ 学习笔记--class String(02)class String的全部内容,希望文章能够帮你解决c++ 学习笔记--class String(02)class String所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部