2011-03-18 185 views
0

快速的问题。如果我有一个数组,并已妥善重载赋值运算符,然后当我做这样的事情:C++复制构造函数调用

A = B 

当A和B是数组类型的两个对象,我会调用拷贝构造函数,或者仅仅是超载赋值运算符(=)?

我知道,一个拷贝构造函数被调用时

  1. 按值传递
  2. 回报当一个对象被声明并给出了相同类型的另一个对象初始化类类型
  3. 值括号内。

3以上让我感到困惑,并认为A = B也在调用复制构造函数。

它只是调用重载的赋值运算符吗?

谢谢!如果执行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 
}; 

如果上述类的定义,然后赋值运算符应该叫

回答

1

由于您已经说过数组是您自己的类,并且有重载的赋值运算符,所以您已经回答了您自己的问题。

拷贝构造函数,当你从另一个构造对象从字面上只叫:

的OBJ一个; Obj b(a);

它可能被清盘的某种神奇的编译器,如果你做的叫:

的OBJ一个; Obj b = a;

但我从来没有打扰到实际上看起来。

如果你只是做a = b你不构造一个,所以你不会调用复制构造函数。

有意义吗?

+0

如果有疑问,请在复制构造函数和赋值运算符中添加一些跟踪并运行代码。你很快会看到发生了什么。 – 2011-03-18 03:23:07

+0

是的,我一直在读我的教科书近14个小时。我明白了这一点,但我现在已经过去了,我很累,开始迷惑自己。我要去睡觉了哈哈..谢谢大家! – Ben 2011-03-18 04:11:56

0

重载赋值运算符被调用。

+0

我知道赋值运算符被调用,我只是想知道是否也调用了复制构造函数。谢谢你们在作业中的作业 – Ben 2011-03-18 03:17:42

3

以上都不是:你不能分配数组。


如果你有自己的数组类,它有这样的事情:

struct arr 
{ 
    arr& operator=(const arr& other) 
    { 
     // ... 
    } 
}; 

arr a, b; 

那么这些是相同的:

a = b; 
a.operator=(b); 

这就像调用一个函数。

+0

我们做了我们自己的数组班,抱歉我应该这么说。这是一个用户定义的数组类 – Ben 2011-03-18 03:09:31

+0

无论哪种方式,假设它不是数组,它是一个不同类型的对象,它是复制构造函数还是重载赋值运算符? – Ben 2011-03-18 03:10:31

+0

@Rhinoo:如果你在声明时进行赋值,即初始化,那么它是一个拷贝构造函数,在其他地方它是一个赋值操作符。另外我认为你可以使第一个案例成为Optimization的赋值操作符(但我从来没有试过这样做)。 – 2011-03-18 04:02:45

0

拷贝构造函数被调用-as你说 - 当

  1. 按值传递
  2. 回报当一个对象被申报并经同一类型的另一个对象初始化类类型
  3. 值在括号中给出或作为转让。

考虑下面的代码的输出:

#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; 
} 
0

3以上使我困惑并认为A = B也调用拷贝构造。

除非你的拷贝构造函数声明explicit,下面就确实调用拷贝构造函数:

MyType A = B; // will call copy ctor 

我相信标准保证了这一点(我没有我的参考方便),所以你知道你将不会调用默认的ctor,然后是赋值运算符。