首页 > 其他分享 >Class with pointer member(s) -> 带指针的类

Class with pointer member(s) -> 带指针的类

时间:2024-03-28 19:33:33浏览次数:18  
标签:char const String pointer member str data Class 指针

Class with pointer member(s) -> 带指针的类

String字符串为讲解对象

设计一个Class先设计头文件

示例代码:

#pragma once

// 防卫式声明
#ifndef __STRING__
#define __STRING__

#include <string.h>

// 头文件定义
class String
{
public:
// 设计构造函数 -> 这里只是定义了函数接口.并没有实现
String(const char* cstr = 0);
String(const String& str); // 接收自己为参数,所以是拷贝构造
String& operator=(const String& str);
~String(); // 析构函数 -> 当类死亡的时候(离开他的作用域)析构函数就会被调用
// 成员函数 -> 因为不去改变m_data的值,所以一定要加上const
char* get_c_str() const { return m_data; }
private:
// 指向字符的指针
char* m_data;
};

inline
String::String(const char* cstr = 0)
{
// 检查是否传入空指针
if (cstr)
{
// 分配内存空间
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
// 空指针也要返回一个空字符串 -> \0为最后一位
m_data = new char[1]; // 放置结束符号
*m_data = '\0';
}
}

// 定义析构函数
inline
String::~String()
{
// 清理动态分配的内存
delete[] m_data;
}

#endif // !__STRING__

浅拷贝

赋值操作直接改变指针,会造成原本指向两块的指针指向同一块区域,另一块区域没有指针指向.会导致内存泄漏

需要的是开辟一块内存区域存储值

示例代码:

#pragma once

// 防卫式声明
#ifndef __STRING__
#define __STRING__

#include <string.h>

// 头文件定义
class String
{
public:
// 设计构造函数 -> 这里只是定义了函数接口.并没有实现
String(const char* cstr = 0);
String(const String& str); // 接收自己为参数,所以是拷贝构造
String& operator=(const String& str); // s2 = s1,作用的是s2,那么s2就要先自毁,自毁完了以后在创建一个和s1一样大的内存空间进行拷贝
~String(); // 析构函数 -> 当类死亡的时候(离开他的作用域)析构函数就会被调用
// 成员函数 -> 因为不去改变m_data的值,所以一定要加上const
char* get_c_str() const { return m_data; }
private:
// 指向字符的指针
char* m_data;
};

inline
String::String(const char* cstr = 0)
{
// 检查是否传入空指针
if (cstr)
{
// 分配内存空间
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
}
else
{
// 空指针也要返回一个空字符串 -> \0为最后一位
m_data = new char[1]; // 放置结束符号
*m_data = '\0';
}
}

inline
String::String(const String& str)
{
// 动态分配内存
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}

inline
String& String::operator=(const String& str)
{
// 自检 -> 这里的this是指调用者 -> 运算符作用的对象 -> 很关键
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;
}

#endif // !__STRING__

如果没有自检,那么在双指针指向同一块内存区域的情况下

  • 一开始就会杀掉内存区域

  • 第二个动作去动态开辟空间就无法获得大小长度

标签:char,const,String,pointer,member,str,data,Class,指针
From: https://www.cnblogs.com/JunkingBoy/p/18102461

相关文章

  • iOS - Runtime - Class-方法缓存(cache_t)
    文章目录iOS-Runtime-Class-方法缓存(cache_t)1.散列表的存取值iOS-Runtime-Class-方法缓存(cache_t)Class内部结构中有个方法缓存(cache_t),用散列表(哈希表)来缓存曾经调用过的方法,可以提高方法的查找速度。(使用空间换时间的方式来提升速度)其中,_buckets就......
  • react零基础到精通-1|基础概念,主要特性,s6语法,react相关的开发环境和工具,react简介,箭头
    致力于解决复杂视图层开发我呢提,全新的ui组件的开发理念,1.1React简介前端UI的本质问题是如何将来源于服务器端的动态数据和用户的交互行为高效地反映到复杂的用户界面上。React另辟蹊径,通过引入虚拟DOM、状态、单向数据流等设计理念,形成以组件为核心,用组件搭建UI的开发......
  • 论文解读(ACDNE)《Adversarial Deep Network Embedding for Cross-Network Node Classif
    Note:[wechat:Y466551|可加勿骚扰,付费咨询]论文信息论文标题:AdversarialDeepNetworkEmbeddingforCross-NetworkNodeClassification论文作者:XiaoShen、QuanyuDai、Fu-laiChung、WeiLu、Kup-SzeChoi论文来源:2020 AAAI论文地址:download 论文代码:download视屏讲解:c......
  • UE4.27, 代码实践, 资源加载 FSoftClassPath / FSoftObjectPath
    //以下的FSoftClassPath/FSoftObjectPath都公开在Editor里设定 //iteminTArray<FSoftClassPath>FSoftClassPathtemp=FSoftClassPath_UsedInBluePrint_BuildFunc(item);UClass*LoadedClass=temp.TryLoadClass<AActor>();FSoftClassPathFSoftClassPath_UsedInBlu......
  • typestack/class-validator
    typestack/class-validatorPublicNotificationsFork 756 Star 10.4k CodeIssues217Pullrequests29DiscussionsActionsSecurityInsights typestack/class-validator   develop4 Branches25 Tags  Code......
  • C++ Class
    this指针this指针是一个const指针,指向当前对象,通过this可以访问当前对象的所有成员,无论是protect/private/public。以下是一个示例:#include<iostream>classstu{public:voidsetA(intA);voidsetB(intB);voidprint();private:intA,......
  • objective-c之Class底层结构探索
    isa走位图在讲OC->Class底层类结构之前,先看下下面这张图:通过isa走位图得出的结论是:1,类,父类,元类都包含了isa,superclass2,对象isa指向类对象,类对象的isa指向了元类,元类的isa指向了根元类,根元类isa指向自己3,类的superclass指向父类,父类的superclass指向的根类,根......
  • 获取 Class 对象的 3 种方法
    调用某个对象的getClass()方法Personp=newPerson();Classclazz=p.getClass();调用某个类的class属性来获取该类对应的Class对象Classclazz=Person.class;使用Class类中的forName()静态方法(最安全/性能最好)Classclazz=Class.forName("类的全路径");(最常用)......
  • Error: Could not find or load main class org.apache.hadoop.hbase.util.GetJavaPro
    Hbase没有将其自身的依赖包添加到classpath配置路径所以才会导致找不到自身主类的报错vim/usr/local/hbase/bin/hbase 在161行出修改CLASSPATH="${HBASE_CONF_DIR}"CLASSPATH=${CLASSPATH}:$JAVA_HOME/lib/tools.jar:/usr/local/hbase/lib/*修改成功后,不再报错......
  • 【Coursera GenAI with LLM】 Week 3 LLM-powered applications Class Notes
    ModeloptimizationstoimproveapplicationperformanceDistillation:usesalargermodel,theteachermodel,totrainasmallermodel,thestudentmodel,wefreezeteacher'sweightsandgeneratecompletions,alsogeneratestudentmodel'scompl......