快速提问。如果我有一个数组并且正确地重载了赋值运算符,那么当我做这样的事情时:
A = B
当A和B都是数组类型的对象时,我是调用复制构造函数,还是只调用重载赋值运算符(=)?
我知道在
时会调用复制构造函数它只是调用重载的赋值运算符吗?
谢谢!
答案 0 :(得分:3)
以上都不是:你不能分配数组。
如果你有自己的数组类,它有类似的东西:
struct arr
{
arr& operator=(const arr& other)
{
// ...
}
};
arr a, b;
然后这些是等价的:
a = b;
a.operator=(b);
就像调用一个函数一样。
答案 1 :(得分:1)
既然你已经说过数组是你自己的一个带有重载赋值运算符的类,那么你已经回答了自己的问题。
复制构造函数实际上只在从另一个构造对象时调用:
Obj a; Obj b(a);
如果你这样做,可能会被某种编译器魔法调用:
Obj a; Obj b = a;
但我从来没有费心去实际看那个。
如果你只是做a = b你没有构建一个,那么你就不会调用复制构造函数。
有意义吗?
答案 2 :(得分:0)
如果执行了A=B;
class userDefinedArray
{
int size ;
int* ptr;
public:
userDefinedArray( int size ) : size(size)
, ptr( new int[size] )
{}
// The Big Three = 1. Copy Constructor 2. Assignment Operator 3. Destructor
};
如果上面是类定义,则应调用赋值运算符。
答案 3 :(得分:0)
复制构造函数被称为-as you-when
考虑以下代码的输出:
#include <iostream>
using std::cout;
class Test
{
public:
Test()
{
}
Test(const Test& T)
{
cout << "Calling Copy Constructor";
}
};
void PassingValue(Test T)
{
cout << " while Passing parameter by value\n\n";
}
void PassingReference(Test &T)
{
cout << "NOT CALLING copy constructor while Passsing Parameter by reference\n\n";
}
int main()
{
Test One;
// case 1 :
cout << "case 1 : \n";
Test Two(One);
cout << " while creating Two as a copy of One\n\n";
// case 2 :
cout << "case 2 : \n";
PassingValue(One);
// case 3 :
cout << "case 3 : \n";
Test Three = Two;
cout << " while assigning initial value\n\n";
// case 4 :
cout << "case 4 : \n";
PassingReference(Two);
// case 5
cout << "case 5 : \n";
Test Four;
Four = Three;
cout << "NOT CALLING copy constructor while assigning normally\n\n";
return 0;
}
答案 4 :(得分:0)
上面的<3>让我感到困惑,并认为A = B也在调用复制构造函数。
除非您的复制构造函数声明为explicit
,否则以下内容确实会调用复制构造函数:
MyType A = B; // will call copy ctor
我相信标准保证这个(我没有我的参考方便)所以你知道你不会调用默认的ctor,然后是赋值运算符。