[初]定制类的基本复制行为

MySQL之复制拓扑扩展与功能定制实战指南 大家好!在数据库架构设计中,复制拓扑的灵活性和功能定制能力是应对复杂业务需求的关键。写作本文的初衷,是希望与各位开发者、运维人员分享MySQL复制拓扑的扩展方案(如金字塔形拓扑、选择性复制)及功能定制技巧,通过通俗解析和实战案例,帮助大家构建适应业务特性的高效复制系统。文中将结合拓扑特点、配置代码和适用场景,助力读者掌握复杂复制架构的设计与优化思路。欢迎随时交流探讨! 阅读详情

定义复制控制函数最为困难的部分通常在于认识到它们的必要性.

                                                                                             ---------<<C++Primer中文版(第4版)>>P441

 

分配内存或其他资源的类几乎总是需要定义复制控制成员来管理所分配的资源。如果一个类需要析构函数,则它几乎也总是需要定义复制构造函数和赋值操作符。

 

 

 

 

 

 

 

下面这个小程序使用自定义的String类,并显式的定义复制构造函数,重载赋值运算符,和给出析构函数以达到精确控制类的基本行为的目的。

1

String s = "hello";

String t;

String k = s;                  //调用了显式的复制构造函数

t = s;                              //调用显式的重载的赋值运算符

t[0] = 'j';                         

如果没有显示的提供这些行为的控制,当t[0]第一个字母被改动时,s的第一个字幕也将改变,因为他们共享”hello”在堆上的内存区域。这就是所谓的”浅拷贝”。

显式的定义复制构造函数,重载赋值运算符能精确到达控制类的行为的目的,这里我们需要t的改变不影响到s,也就是所谓的”深拷贝”.

2

还有一点要注意的是就是String k = s;时,这里的=号并不是被当重载的赋值运算符号,也就是说在定义类的新对象时候,= 不被当作是重载的赋值运算符。

只是调用了类的复制构造函数String(const & String);

 

#include <cstddef>

#include <iostream>

 

//参考资料<<C和C++代码精粹>>第20章

 

using namespace std;

 

class String {

public:

    String() {

        count = 0;

        data="";

    };

String(const String&);                            //复制构造函数

String& String::operator=(const String& s);          //重载赋值运算符                          (这三者应该同时显式定义)

~String();                                                                              //析构函数

    String(const char*);        char& operator[] (size_t pos);

        friend ostream& operator<<(ostream&,const String&);

private:

    char* data;

    size_t count;

    void clone(const char*);

};

 

inline String::String(const char *s) {

    clone(s);

}

 

inline String::~String() {

    delete [] data;

}

 

inline char& String::operator[](size_t pos) {   //在inline函数不写return也不会报错?(070406)

    return data[pos];

}

 

//显式的复制构造函数定义

String::String(const String& s) {

    clone(s.data);

}

 

//显示的赋值操作符重载

String& String::operator=(const String& s) {

    if (this!=&s) {

        delete[] data;

        clone(s.data);

    }

    return *this;

}

 

ostream& operator<<(ostream& os, const String& s) {

    os.write(s.data,s.count);

    return os;

}

 

void String::clone(const char*s) {

    count = strlen(s);

    data = new char[count+1];

    strcpy(data,s);

}

 

 

int main(int argc,int argv[]) {

    String s = "hello";

String t;

String k = s;                  //调用了显式的复制构造函数

t = s;                              //调用显式的重载的赋值运算符

    t[0] = 'j';                          //深拷贝

    cout << "S == " << s << endl;

    cout << "t == " << t << endl;

    return 0;

}

 

 

 

 

 

 

下面这个程序说明了在我们没有显式定义复制构造函数,赋值运算符时,编译器会为我们提供隐式的

#include <iostream>

#include <string>

#include <cstdio>

 

using namespace std;

 

class MemberA {

private:

    string name;

public:

    MemberA(string& _name) throw();

         ~MemberA() throw();

    //编译器在此添加隐藏的拷贝构造函数和赋值操作

};

 

MemberA::MemberA(string& _name) throw() {

    name = _name;        

    cout << "constructing " << name  << "!/n";

}

 

MemberA::~MemberA() throw() {

         cout << "deconstruct " << name  << "!/n";

}

 

class MemberB {

private:

    string name;

public:

    MemberB(string& _name) throw();

    ~MemberB() throw();

    MemberB(const MemberB&) throw();                             //覆盖默认拷贝操作

    MemberB& operator= (const MemberB&) throw();                 //覆盖默认赋值操作

};

 

MemberB::MemberB(string& _name) throw() {

    name = _name;        

    cout << "constructing " << name  << "!/n";

}

 

MemberB::MemberB(const MemberB& member) throw() {

    name = member.name;

    cout << "copying a Member/n";

}

 

MemberB::~MemberB() throw() {

         cout << "deconstruct " << name  << "!/n";

}

 

MemberB& MemberB::operator= (const MemberB&) throw(){

    cout << "assigning a Member/n";

    return *this;

}

 

int main() {

         {

        cout << "调用编译器提供的默认赋值操作的memberA ";

        string s1("A");

        string s2("B");

        string s3("C");

                   MemberA a(s1);

                   MemberA b(s2);

                   MemberA c(s3);

        c = a;

         }

 

    {

        cout << "调用编译器提供的默认拷贝操作的memberA";

        string s1("A");

        string s2("B");

        string s3("C");

                   MemberA a(s1);

                   MemberA b(s2);

                   MemberA c = a;

         }

 

         {

        cout << "调用自定义赋值操作(覆盖编译器默认赋值操作)的memberB ";

        string s1("A");

        string s2("B");

        string s3("C");

                   MemberB a(s1);

                   MemberB b(s2);

                   MemberB c(s3);

        c = a;

         }

 

    {

        cout << "调用自定义拷贝操作(覆盖编译器默认拷贝操作)memberB";

        string s1("A");

        string s2("B");

        string s3("C");

                   MemberB a(s1);

                   MemberB b(s2);

                   MemberB c = a;

         }

 

    system("pause");

}

 

 

用 AGENTS.md 定制 Codex 行为(快速上手指南) 本文详细介绍了如何使用AGENTS.md文件定制Codex AI编程助手的行为,实现代码生成的个性化与规范化。通过定义全局、项目及目录层级的规则,AGENTS.md能有效指导Codex生成符合团队规范与项目结构的代码,提升开发效率与协作一致性。文章提供了从原理到实战的完整指南,包括模板示例与多场景配置策略。 阅读详情

相关推荐

风变Python编程13类的学习2

Python 类的学习2 上一关,我们知道了面向对象编程的重要性,也学习了类的基础知识(1.面向对象编程,2.类的创建和调用,3.创建类的两个关键点) 这一关,我们会拓展类的知识疆界,探索两个类的拓展玩法:类的定制和类的继承。 说是拓展,是因为这两个知识点属于类中较高阶的操作,让用类写成的代码更容易复用、拓展和维护(这些优势在了解继承和定制后,就能理解了)。 可以这么说:类能成为面向对象编程的主...

leianuo123的博客 3131

Python基础语法学习(第二讲)---类的继承与定制

【写在前面】今天更新python自学系列第二讲---类的继承与定制。第一讲在这里:https://blog.youkuaiyun.com/include_645829461/article/details/90347233 希望看见文章的大佬们可以指点自己的不足,因为本人也学过部分java和c++,所以在更新这块部分的内容的时候会把它与java或者c++做类比。之前学的语法会在后面一一更新,敬请期待。(声明...

include_645829461的博客 1万+

30、SharePoint 中母版页的复制、定制与管理

本文详细介绍了 SharePoint 中母版页的复制、定制与管理方法。内容包括母版页的复制与保存、定制步骤、更改默认母版页的操作,以及对内容占位符的管理。通过实际操作示例,帮助用户掌握如何灵活使用 SharePoint Designer 对母版页进行个性化设置,以实现网站页面风格的统一与高效管理。

hp777的博客 118

python面向对象高级编程:定制类

在Python的面向对象编程(OOP)中,定制类通常涉及覆盖(或扩展)类的内置方法(也称为魔术方法或特殊方法),这些方法以双下划线(__)开头和结尾。通过覆盖这些方法,你可以改变类的行为,比如对象的创建和销毁、属性的访问、以及对象之间的比较等。

2301_78045723的博客 610

30、掌握 SharePoint 母版页:复制、定制与管理指南

本文详细介绍了如何在 SharePoint 中复制、定制和管理母版页。涵盖了母版页的基本概念、创建自定义母版页的步骤、在母版页中添加数据视图 Web 部件(DVWP)、设置默认母版页以及管理内容占位符等内容。通过本文,读者可以掌握 SharePoint 母版页的核心操作,确保网站页面外观一致并高效维护。

cuda7parallel的博客 103

(38)System Verilog类class复制详解

(38)System Verilog类class复制详解 1.1 目录 1)目录 2)FPGA简介 3)System Verilog简介 4)System Verilog类class复制详解 5)结语 1.2 FPGA简介 FPGA(Field Programmable Gate Array)是在PAL、GAL等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。 FPGA

m0_46498597的博客 179

Effective C++ 详解条款14: 在资源管理类中小心coping行为

许多资源被动态分配于堆 heap 内而后被用于单一区块或函数内。它们应该在控制流离开那个区块或函数时被释放。标准程序库提供的auto_ptr 正是针对这种形势而设计的。 条款13就描述了auto_ptr和 tr1 : :shared_ptr是如何将“资源取得时机便是初始化时机(Resource Acquisition Is Initialization,RAII)”表现在基于堆(heap-based)资源上。 然而并非所有资源都是heap-based,对那种资源而言,像auto_ptr和 tr1 : :sh

qq_36698189的博客 496

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1003

第二章:数据结构-copy:复制对象-定制复制行为

2.9.3 定制复制行为 可以使用特殊方法__copy__()和__deepcopy__()来控制如何建立副本。调用__copy__()而不提供任何参数,这会返回对象的一个浅副本。调用__deepcopy__(),并提供一个备忘字典,这会返回对象的一个深副本。所有需要深复制的成员属性都要连同备忘字典传递到copy.deepcopy()以控制递归(备忘字典将在后面更详细地解释)。 下面这个例子展示了...

编程菜鸟iglesias的博客 333

Android 关于佳博和汉印蓝牙热敏打印机开发,Android程序员必经的实践之路

针对于上面的问题,我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料。(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84149570的博客 1021

深入浅出:CosineLRScheduler 调度器的原理与实战应用

本文深入解析了CosineLRScheduler调度器的核心原理与实战应用,详细介绍了余弦退火算法及其在深度学习模型训练中的优势。通过参数配置建议、PyTorch实现示例和常见问题解决方案,帮助开发者高效应用该调度器提升模型性能,特别适用于计算机视觉和自然语言处理任务。

sss66的博客 859

定制类

形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。如__len__()方法是为了能让class作用于len()函数。除此之外,Python的class中还有许多这样有特殊用途的函数,可以帮助我们定制类。1、字符串定制__str__首先顶一个一个Person 类,通过输出一个实例引入定制类的问题#Coding = utf- 8 class Person(...

止语的博客 374

华为灵衢UB总线介绍

华为发布"灵衢"(UB)超节点互联协议,旨在构建支持AI大模型计算的基础设施。该协议采用统一内存语义和对等架构,使设备可直接访问远程内存,实现资源池化。技术突破包括2.1微秒超低时延和TB级带宽,支持64节点、52万张昇腾卡的集群互联。相比传统RDMA,"灵衢"更注重系统级资源调度,而非单纯数据传输。华为开放技术规范,推动生态建设,已有厂商开发兼容IP核。"灵衢"可适应x86、RISC-V等架构,未来将扩展至百万卡规模集群。

技术引领业务创新 4420

CVAT 自动标注指南:从模型选择到阈值调优的完整流程

你手里有一批图片或视频需要标注,但不想从零开始逐个画框。CVAT(Computer Vision Annotation Tool)的自动标注功能可以把整个任务交给已部署的检测模型一次性预标注,你只负责核对和修正结果。本文面向第一次使用该功能的人,按"前置条件 → 打开对话框 → 标签匹配 → 参数调优"的顺序说明操作。 ## 🧭 开始自动标注前的两个前提 开始操作前需要确认两件事,任何一件缺

gitblog_00680的博客 449

《唤醒你的AI同事:WorkBuddy从零上手》004:与其他 AI 工具的对比

把 WorkBuddy 与聊天机器人、办公套件内置 AI、自动化工具逐维对比,并按当前版本补充四项新差距:结果交付、连接器广度、资料库与多模态产出。

LuckyHanMo的博客 669

PCIE总线及其PCIE SWITCH的使用

PCIe总线与PCI最大的区别在工作原理上,PCIe是采用点到点的串行方式进行传输的,被称为“串行PCI”,由于采用了串行方式传输使得其工作频率可以达到2.5Ghz,大大增加了传输速率,同时采用全双工的通信方式,使得其传输速度提高了一倍,每一个PCIe总线设备与外部通信时有四根数据总线,分别有两个RX和TX,两根用于发送,两根由于接收。PCIe switch中文翻译为PCIe开关或PCIe交换机,主要作用将PCIe设备互联,PCIe switch芯片与其设备的通信协议都是PCIe;

zxm8513优快云博客 4735

JavaSE——Arrays类、System类

JavaSE——Arrays类、System类

雷神乐乐的博客 843

三菱FX5U气缸控制功能块(完整ST源代码+示例程序)

如果机器包含100个气缸,我们只需要修改数组的元素数量就可以了,效率非常的高。待续....博途PLC 面向对象系列之“双通气缸功能块“(SCL代码)_plc面向对象-优快云博客文章浏览阅读667次。本文介绍了博途PLC中面向对象编程的应用,重点讲解了双通气缸的功能块设计,包括双通电磁阀功能块、双通气缸的UDT数据类型以及SCL代码实现。同时,对比了双通与单通电磁阀的差异,并讨论了将单通气缸改造为双通气缸的方法,强调了双通气缸在安全性上的优势。

RXXW_Dor的博客 1027

面向对象三(类的定制和继承)2020-11-25

文章目录1. 类的定制和继承1.1 什么是类的继承和定制1.1.1 类的继承1.1.2 类的定制1.2 类的继承的语法1.3 多层继承和多重继承1.3.1 多层继承1.3.2 多重继承2. 类的定制2.1 新增代码2.2 重写代码 1. 类的定制和继承 这一关,我们会拓展类的知识疆界,探索两个类的拓展玩法:类的定制和类的继承。说是拓展,是因为这两个知识点属于类中较高阶的操作,让用类写成的代码更容易复用、拓展和维护(这些优势在了解继承和定制后,就能理解。可以这么说:类能成为面向对象编程的主要工具,帮助 Pyt

m0_46738467的博客 322

AI大模型助力现金流精准预测案例详解

因为它的“注意力机制”能像“人一样思考”——比如,当预测“下周现金流”时,模型会重点关注“最近7天的销售数据”“未来7天的天气”“竞品是否有促销”这些关键因素,而忽略“去年同期的无关数据”。AI大模型不是“取代”财务人员,而是“赋能”他们——把财务人员从“重复的Excel操作”中解放出来,专注于“战略决策”(比如如何优化资金结构、如何提升资金利用率)。比如,“促销力度”这个特征,不是简单的“折扣率”,而是“折扣率×促销天数×覆盖SKU数量”,这样能更准确反映促销对现金流的影响。这些问题的核心,其实是。

AIGC应用创新大全的博客 1258

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Python学习笔记——类的继承和定制

毕竟,类的定制的前提是继承,而定制的加入让类的继承不仅仅只是单纯的复制而已。那么,只要创建一个父类Chinese,在父类中将共同的属性和方法写好,然后34个类都可以通过类的继承得到Chinese的属性和方法,代码量可以减少十几甚至几十倍。简而言之:类的定制,不仅可以让子类拥有新的功能,还能让它有权修改继承到的代码——在写这句话时,我仿佛看到子类化成了一个人,抬头瞟了一眼在他上方的父类,淡淡地说了一句话:以我为主,为我所用。在Python中,我们的习惯表述是:A类是B类的子类,而B类是A类的父类(或超类)。

kuangweihan的博客 371

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Array类

Array类包含了一系列的静态方法,用于管理和操作数组(比如排序和搜索)Array类提供了动态创建和访问Java数组的静态方法。

WINorYU的博客 700

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python中实现定制类的特殊方法总结

这篇文章主要介绍了python中实现定制类的特殊方法总结,本文讲解了__str__、__iter__、__getitem__、__getattr__、__call__等特殊方法,需要的朋友可以参考下 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的。 __slots__我们已经知道怎么用了,__len__()方法我们也知道

宇宙浪子的专栏 711

开源杂谈 : 理解开源框架的定制思路

作为开源软件,是有可能无法满足业务场景的.这一篇主要从思想的角度来看 ,如何对开源框架进行深度的改造. 主要以 SpringMVC DispatchServlet 的定制为案例.对于开源框架的深度定制其实是无赖之举 ,定制的目的是为了不破坏原有的逻辑,其实前后置处理器和链表中插入才是最合适的.不然别人出现个漏洞升级了 ,你代码就得完蛋。

java1527的博客 862

加密狗复制定制服务

加密狗(Dongle)是一种硬件加密设备,用于软件版权保护。某些情况下,用户可能需要复制或定制加密狗,例如原狗丢失、损坏或需要批量部署。专业服务商提供加密狗复制定制服务,确保合法合规的前提下满足特定需求。

Greer82 加密狗复制模拟等 144

如何定制GNOME Pomodoro:个性化声音、主题和行为的终极教程

GNOME Pomodoro(现更名为FocusTimer)是一款基于番茄工作法的GNOME时间管理工具,帮助用户通过专注工作与休息的循环提高 productivity。本教程将带你探索如何深度定制这款工具,从声音提醒到主题外观,再到自动化行为,打造完全符合个人习惯的专注助手。 ## 🎯 准备工作:安装与基础设置 首先确保你已安装GNOME Pomodoro。如果尚未安装,可以通过以下命令从

gitblog_01145的博客 617
上一篇: qt4环境下跑qt3程序的遇到的小问题
下一篇: Eclipse 快捷键大全
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值