C++复制构造函数和=号重载问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++复制构造函数和=号重载问题相关的知识,希望对你有一定的参考价值。

类的部分代码如下:
IntCell(const IntCell &rhs)

storedValue = new int(*rhs.storedValue);


const IntCell& operator=(const IntCell &rhs)

if (this != &rhs)

*storedValue = *rhs.storedValue;

return *this;


为什么复制构造函数里,如果换成
*storedValue = *rhs.storedValue;
就编译不过了呢?

为什么复制构造函数必须new,而operator= 就可以不用new吗?
他妈的,我想通了,复制构造函数用在类定义的时候,这是就跟普通构造函数一样,指针成员是需要new,,而使用=号时,左值是已经存在的对象,,,当然不用再new了,,

可能表述有问题,但我觉得我想通了,,大神来看看

表述基本上没有问题。从功能上来说,构造函数是用于创建对象的,operator其实是可以看成普通的成员函数,只不过是以符号的形式代替文字,看上去更加直观。
所以在构造函数中,需要对成员变量进行初始化,包括创建所需的空间等等。而operator调用时,对象已经创建完毕,不需要继续进行空间的创建。
参考技术A 嗯,是这个意思,没有复制构造之前,你的storedValue没有初始化,存的是随机地址,所以这时使用*storedValue = *rhs.storedValue;去改变那个随机地址里的值是很危险的。 参考技术B 如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在,然后将另一个已存在的对象赋给它,调用的就是赋值运算符(重载) 参考技术C 你都想通了还问什么。。追问

问题都发出去了,然后想通了,,你第一个回答就采纳你了

本回答被提问者采纳

如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]

【中文标题】如果我们在 C++ 中重载构造函数,默认构造函数是不是仍然存在? [复制]【英文标题】:If we overload a constructor in c++ does the default constructor still exist? [duplicate]如果我们在 C++ 中重载构造函数,默认构造函数是否仍然存在? [复制] 【发布时间】:2012-09-04 21:42:08 【问题描述】:

可能重复:Why does the default parameterless constructor go away when you create one with parameters

我写了以下程序

#include <iostream>
class A 
public:
    A(int i) std::cout<<"Overloaded constructor"<<std::endl;


int main() 
A obj;
return 0;

当我编译程序时出现以下错误:

没有匹配的函数来调用 A::A() 候选人是: A::A(整数) A::A(const A&)

【问题讨论】:

您回答了自己的问题。这是good question 说明原因。 【参考方案1】:

这种情况下默认构造函数的存在取决于你是否定义它。如果您自己定义另一个构造函数,它将不再被隐式定义。幸运的是,它很容易带回来:

A() = default;

请注意,术语“默认构造函数”是指可以不带任何参数调用的任何构造函数 (12.1p5);不仅适用于有时隐式定义的构造函数。

【讨论】:

如果你有 C++11。 是的,但这是一种相当不错的短方法。【参考方案2】:

不,根据标准默认构造函数在这种情况下不会生成。但是,在 C++11 中,您可以声明您希望使用以下命令生成默认构造函数:

class A 
public:
  A() = default;
  A(int);
;

【讨论】:

【参考方案3】:

您可以按照上面的建议编写一个默认构造函数,然后在您的 maing 函数中编写:

A* obj = new A();

例如,您可以在 main 函数中编写

A* obj = new A(5);

你可以在你的构造函数中设置

public:
A(int i=0) 
 
    cout << "My own  constructor!"; 
; 

当您创建该类的对象时,您可以使用它来编写

`A* obj = new A(5);`

这会将变量 i 更改为具有值 5 或者你可以像这样初始化你的对象

`A* obj = new A();` 

这将使变量 i 保留默认值 0

【讨论】:

除非声明了A* obj,否则A obj = new A(5); 不需要复制构造函数或赋值运算符吗?如果您希望它在堆栈上而不是堆上,我会选择 A obj(5); 哦,我的错。我最近一直在写 c#,有点搞混了:)【参考方案4】:

这是 C++ 约定。当您编写任何用户定义的构造函数时,它假定您不需要隐式的非参数构造函数。这是可以理解的,所以记住它。

【讨论】:

以上是关于C++复制构造函数和=号重载问题的主要内容,如果未能解决你的问题,请参考以下文章

c++中拷贝构造函数和赋值运算符重载本质上一样么

c++ 拷贝构造函数与赋值运算符重载函数的区别是

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载

C++类的成员函数:构造析构拷贝构造运算符重载