2017-03-31 60 views
-1

我正在尝试使用矩阵做一个简单的练习,并且我想实现这个操作:矩阵a,矩阵b,矩阵c(a),矩阵d = a,矩阵e = a + b。目前我保持简单,但后来我想做同样的事情,但动态分配和后来的智能指针。复制构造函数,而不是运算符=

我宣布了一个明确的拷贝构造函数,并且我重载了operator =,我还声明了一个析构函数,所以我有三条规则。

这里是我的功能:

Matrix& Matrix::operator=(const Matrix& opEven) 
{ 
    std::cout << "Operator = " << std::endl; 
    for (int i = 0; i < ORD; i++) 
    { 
     for (int j = 0; j < ORD; j++) 
     { 
      arr1[i][j] = opEven.arr1[i][j]; 
     } 
    } 

    return *this; 
} 

Matrix::Matrix(const Matrix& obj) 
{ 
    std::cout << "Constructing matrix using copy c-tor." << std::endl; 
    for (int i = 0; i < ORD; i++) 
    { 
     for (int j = 0; j < ORD; j++) 
     { 
      arr1[i][j] = obj.arr1[i][j]; 
     } 
    } 
} 

的问题是,当我尝试使用矩阵d =我的编译器使用拷贝构造函数,而不是我的运算符=。

Output:

回答

2

当你称呼它

Martix a; 
Matrix b = a; 

它总是使用拷贝构造函数。试试这个:

Matrix a; 
Matrix b: 
b = a; 

基本上Matrix a = b;Matrix a(b);是一样的东西,因为你是使用矩阵b构建矩阵a,使引起拷贝构造函数调用。

+0

谢谢,现在它可以工作。 但我不得不称之为矩阵b = a,并以运算符= –

+0

那么,这就是C++的工作原理,当你的对象还没有被构建时,你不能使用赋值运算符。 –

+0

@ Teodor-MarianWolf你不能。任何形式为“Type name = something”的东西都会调用复制构造函数。这就是语言的工作原理。 – NathanOliver