C++中调用复制(拷贝)函数的三种情况总结

 更新时间:2022年11月05日 09:00:21   作者:小刘是学生  
这篇文章主要介绍了C++中调用复制(拷贝)函数的三种情况总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1.同一类中的对象1复制给对象2

同样是Point p1; Point p2;

例如:

int main(){
Point p1(1,2);
Point p2=p1;   //这两种都会调用复制构造函数
Point p3(p1);
return 0;
}

2.以对象为函数的形参

例如:

void fun(Point p){ //p 作为了形参
 
cout<<p.height<<endl;
 
}

3.函数返回是类的对象

void fun2(){
Point p1(1,3);
return p1;
}
 
//或者还有返回*this的形式
 
void fun3(){
Point p2(5,8);
x+=4;
y+=6;
return *this;
}

注意:如果意外使用return *this;

导致调用的复制构造函数里面会输出多余的语句(这些语句不可删除)

那么我们应该 让此函数的返回类型改为 void

例题如下(让我记忆犹新)

​设计一个自己的字符串类MyString,内部有一个私有成员char *sptr;该成员用于创建字符串对象时,在内部使用动态内存分配的方法分配一个字符数组用于存储字符串的内容。

  • 为该类设计构造函数、析构函数(对象析构时,要释放分配的数组)
  • 为该类设计返回字符串实际长度的成员函数
  • 为该类设计输出字符串内容的成员函数
  • 为该类设计实现字符串连接和字符串复制的成员函数。字符串连接和字符串复制时,要求重新分配数组,并释放原有的数组。

main函数已经写好,请根据main函数的内容完成该类的设计:

int main(){
MyString s1;
MyString s2("Hello");
MyString s3(s2);
 
s1.printString();
s2.printString();
s3.printString();
 
cout<<s1.getSize()<<" "<<s2.getSize()<<" "<<s3.getSize()<<endl;
 
MyString s4("HiChina"); 
 
s2.stringCopy(s4);
s2.printString();
 
s3.stringCat(s4);
s3.printString(); 
 
return 0;
}

正确解答如下:

//不包括主函数main部分
#include<bits/stdc++.h>
using namespace std;
class MyString{
 char *sptr;
 int size;
public:
 MyString(){
  size=0;
  sptr=new char[1];
  sptr[0]='\0';
  cout<<"Object Constructed. No Memory Allocated."<<endl;
 }
 MyString(char* s){//s是指针 
    size=strlen(s);
    sptr=new char[size+1];
    sptr[size]='\0';
    strcpy(sptr,s);
    cout<<"Object Constructed. "<<size+1<<" Bytes Allocated."<<endl;
 }
 MyString(const MyString&s){//此处s是对象 
  size=s.size;
  sptr=new char[size+1];
  strcpy(sptr,s.sptr);
  cout<<"Object Constructed. "<<size+1<<" Bytes Allocated."<<endl;
 }
 ~MyString(){
  if(sptr[0]=='\0'){cout<<"Object Destructed. No Memory Freed."<<endl;}
  else{
   cout<<"Object Destructed. "<<size+1<<" Bytes Freed."<<endl;
  }
  delete[]sptr;
 }
 void printString(){
  if(!size){cout<<"No Memory Allocated In This Object."<<endl;}
  else  cout<<sptr<<endl;
 }
 int getSize(){
     return size;
 }
void stringCopy(MyString&s){
  cout<<"String Copy, "<<s.size+1<<" Bytes Reallocated And "<<size+1<<" Bytes Freed."<<endl;
  size=s.size;
  sptr=new char[size+1];
  strcpy(sptr,s.sptr);
  sptr[s.size]='\0'; //没有return *this 
 }
 void stringCat(MyString&p){
  char *p1=new char [size+p.size+1];
  size=size+p.size;
  cout<<"String Connection, "<<size+1<<" Bytes Reallocated And "<<p.size-1<<" Bytes Freed."<<endl;
  strcpy(p1,sptr);//p1是换杯子 
  sptr=new char [size+p.size+1];//创建新的大空间 
  strcpy(sptr,p1);
  strcat(sptr,p.sptr);
  
 } 
};

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C语言单链表的图文示例讲解

    C语言单链表的图文示例讲解

    单链表是链表的其中一种基本结构。一个最简单的结点结构如图所示,它是构成单链表的基本结点结构。在结点中数据域用来存储数据元素,指针域用于指向下一个具有相同结构的结点。 因为只有一个指针结点,称为单链表
    2023-02-02
  • C++ Boost实现异步端口扫描器详解

    C++ Boost实现异步端口扫描器详解

    端口扫描是一种用于识别目标系统上哪些网络端口处于开放、关闭或监听状态的网络活动,本文将运用Boost框架实现一个基于TCP的扫描工具,有需要的小伙伴可以参考下
    2023-11-11
  • VC中CWinThread类以及和createthread API的区别分析

    VC中CWinThread类以及和createthread API的区别分析

    这篇文章主要介绍了VC中CWinThread类以及和createthread API的区别分析,较为详细的讲述了CWinThread类的原理,并以实例形式对AfxBeginThread函数的内部实现进行了解释说明,需要的朋友可以参考下
    2014-10-10
  • C++ abs函数实际应用详解

    C++ abs函数实际应用详解

    本文我们来讲C++的abs函数以及实战运用,C++中的abs函数。在C++中使用abs函数要注意存在两种版本,一种是在stdlmb.h中定义的版本,另一个是在cmath头文件中定义的。夷实上在stdlib.h文件是C的函数,而cmath中的是C++版本
    2022-08-08
  • C语言线性表顺序表示及实现

    C语言线性表顺序表示及实现

    这篇文章主要介绍了C语言线性表顺序表示及实现,线性表是最常用且最简单的一种数据结构。简而言之,一个线性表是n个数据元素的有限序列
    2022-07-07
  • C++中线性代数计算Eigen库的使用教程详解

    C++中线性代数计算Eigen库的使用教程详解

    Eigen是一个基于线性代数的C++模板库,主要用于矩阵、向量、数值求解和相关算法,本文主要为大家简单聊聊Eigen库的使用,希望对大家有所帮助
    2023-12-12
  • LintCode 堆化详解及实例代码

    LintCode 堆化详解及实例代码

    这篇文章主要介绍了LintCode 堆化详解及实例代码的相关资料,需要的朋友可以参考下
    2017-04-04
  • 浅谈c++11线程的互斥量

    浅谈c++11线程的互斥量

    互斥量是个类对象,理解成一把锁(保护共享数据,其他想操作共享数据的线程必须等待解锁),互斥量使用要小心,保护数据不多也不少,少了则没达到保护效果,多了则影响效率。本文将介绍c++11线程的互斥量,感兴趣的同学,可以参考下。
    2021-06-06
  • C++ Boost Coroutine使用协程详解

    C++ Boost Coroutine使用协程详解

    通过Boost.Coroutine,可以在C++中使用协程。协程是其他编程语言的一个特性,通常使用关键字yield来表示协程。在这些编程语言中,yield可以像return一样使用
    2022-11-11
  • 不要被C++(自动生成规则)所蒙骗

    不要被C++(自动生成规则)所蒙骗

    正如标题所说,我们不要被C++语法中所描述的那些条条框框所“蒙骗”了。的确,相信这些生成规则不会对我们的编程带来多大的影响(不会产生错误),但是只有了解它们的背后操作,我们才知道编译器究竟为我们做了什么,感兴趣的朋友可以了解下,希望本文对你有所帮助
    2013-01-01

最新评论