复制拷贝函数+重载operator=

首先,如下写法:

Class A = B;

Class A;
A = B;

并不等价,前者等价于A(B),后者等价于A.operator=(B)

  问题源于我想要用类似如下写法完成复制拷贝函数

Class(Class &t) {
    *this = t;
}

  尝试重载operator=,由于写挂了,或者说是return错误的对象,导致死循环或者编译不通过

1.死循环:

  关键在于对复制拷贝函数的理解(什么时候会调用),如果函数的形参不是引用,或者return一个非引用的对象,

就会调用复制拷贝函数,而我的复制拷贝函数又会调用operator=,这样陷入死循环

2.编译不通过

  operator= return的对象,应当是引用,避免调用复制拷贝函数,而这个引用应该是引用对象本身*this,而非传入的const引用

写得也挺乱的,主要是几小时前的问题了,还是要具体的问题具体分析,但是限于本人比较懒,所以列出参考.

1.Class A = B;是个什么意思:http://stackoverflow.com/questions/2462773/c-copy-construct-construct-and-assign-question

2.拷贝构造函数详解:http://blog.csdn.net/lwbeyond/article/details/6202256

3.一个例子加强理解: http://bbs.csdn.net/topics/40006610

时间: 2024-10-26 18:42:07

复制拷贝函数+重载operator=的相关文章

函数重载与复制构造函数

函数重载与复制构造函数   一.函数重载 1.普通函数重载 用main函数多次重复调用一个相同名字但是不同类型的函数来处理不同类型的数据. 如 void func(int); void func(double); float func(float); void func(double); 2.成员函数的重载 我们可以将函数的重载推广到类的成员函数. Class  boy { Public: void  sum(); void  sum(int  x, int  y); } 二.函数的默认参数 在

C++析构、拷贝、赋值、移动拷贝函数的几个知识点(不全)

众所周知,C++的类如果没有默认构造函数,会自动生成一个. 同理,如果没有复制构造函数即A::A(const A&){}这个函数 ,则系统也会自动生成一个,但这个自动生成的复制构造函数不一定满足我们的要求.析构函数也会自动生成(如果没定义的话). 比如下面的例子: 1 class A{ 2 public: 3 int* a; 4 int b; 5 A()=default; 6 A(int x):a(new int(10)){b=x;} 7 ~A(){delete a;cout<<&qu

C++之重载String ----- 构造函数、复制控制、重载操作符

本博文 我们通过 重新实现String类 来说明构造函数,复制控制,重载操作符. 一.构造函数(包括析构函数): 1:默认构造函数: 2:用户自己定义的构造函数 注意:当用户自己定义时,也要明确显示默认构造函数,这是因为,当我们没有定义自己的构造函数时,编译器会为我们自动合成一个,而我们定义了构造函数时,编译器默认构造函数改为我们自己定义的.这时就有可能出现错误: 3:析构函数: 具体声明与实现,代码如下: 1 声明部分: 2 String(); 3 String(const char*s);

编写高质量代码——重载operator=的标准三步走

CString& CString::operator=(const CString& str){   if(this == &str)       //1.自赋值检查       return *this;          if(pChar!=NULL)       //2.释放原有空间     delete[]  pCahr;   pChar = new char[strlen(str.pChar)+1]; // 2.申请新空间   strcpy(pChar, str.pCha

面向对象程序设计——抽象基类,访问控制与继承,继承中的类作用域,拷贝函数与拷贝控制

一.抽象基类 1)纯虚函数 和普通的虚函数不同,一个纯虚函数无须定义.我们通过在函数体的位置(即在声明语句的分号之前)书写=0就可以将一个虚函数说明为纯虚函数.其中,=0只能出现在类内部的虚函数声明语句处. 值得注意的是,我们也可以为纯虚函数提供定义,不过函数体必须定义在类的外部.也就是说,我们不能在类的内部为一个=0的函数提供函数体. 2)含有纯虚函数的类是抽象基类 含有(或者未经覆盖直接继承)纯虚函数的类是抽象基类.抽象基类负责定义接口,而后续的其他类可以覆盖该接口.我们不能直接创建一个抽象

编写实现字符串拷贝函数strcpy()完整版

有个题目编程实现字符串拷贝函数strcpy(),很多人往往很快就写出下面这个代码. void strcpy( char *strDest,char *strSrc ) { while(( *strDest++ = * strSrc++) != '\0' );//逐个赋值字符串数组中的数据,知道字符串结束 } 其实仔细看看这个实现过程并不完美,严格来说非常不严谨,我们可以完善一下. char * strcpy( char *strDest, const char *strSrc )//将源字符串加

C++拷贝函数的小结,关于变量的作用域等---ShinePans

#include <iostream> using namespace std; class circle { private: double r0; public: circle(double r) { r0 = r; cout << r << "调用了球体的初始化的函数\n"; } circle(const circle &t){ r0 = t.r0; cout << "r=" << r0 &l

c++不自动生成相关函数比如赋值、拷贝函数

默认情况下,如果没有明确声明某些函数比如赋值.拷贝函数,c++会自动生成这些函数,通常他们是对成员进行by-value拷贝,有些时候,赋值.拷贝对象并无什么意义或者不合理,比如对于socket或者thread而言,这种情况下,可以明确通过指定=delete告知编译器不要自动生成它们.如下所示: class thread_guard { std::thread& t; public: explicit thread_guard(std::thread& t_): t(t_) {} ~thre

C++ 函数重载与函数匹配

<C++ Primer>笔记,整理关于函数重载与函数匹配的笔记. 函数重载 void func(int a); //原函数 void func(double a); //正确:形参类型不同 void func(int a, int b); // 正确:形参个数不同 int func(int a); //错误:只有返回类型不同 typedef int int32; void func(int32 a); //与原函数等价:形参类型相同 void func(const int a); //与原函数