模板类c++的赋值操作符
Assignment operator of template class c++
永远不调用赋值操作符重载。
在主文件中1。,复制构造函数在2中调用和。,首先调用operator +,然后调用operator *,最后调用默认赋值操作符。
这个问题有什么原因吗?
template<int r, int c, class F = int>
class Matrix {
public:
Matrix(){
int i, j;
data = new F[(r*c)];
for (i = 0; i < c; i++){
for (j = 0; j < r; j++){
data[j + (i*c)] = 0;
}
}
}
...
Matrix(const Matrix& a){
int i=r, j=c;
data = new F[(r*c)];
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
data[j+(i*c)] = a.data[j+(i*c)];
}
}
}
**Matrix operator=(const Matrix a){
int i, j;
if (data != NULL){
delete data;
data = NULL;
}
data = new F[(r*c)];
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
data[j+(i*c)] = a.data[j+(i*c)];
}
}
return *this;
}**
friend Matrix operator+( Matrix<r, c, F>& a, int b){
Matrix<r, c, F> temp;
int i, j;
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
temp.data[j+(i*c)] = a.data[j+(i*c)] + b;
}
}
return temp;
}
Matrix operator*(const int a){
Matrix <r, c, F> temp(*this);
int i, j;
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
temp.data[j+(i*c)] *= a;
}
}
return temp;
}
...
~Matrix(){
delete[] data;
data = NULL;
}
private:
F *data;
};
int main( ) {
...
Matrix<4, 4> identity(1);
std::cout << identity << std::endl;
1.**Matrix<4, 4> res = identity;**
Matrix<4, 4> identity_2(1);
std::cout << identity _2<< std::endl;
2.**Matrix<4, 4> res_2 = (identity_2 + 2) * 3;**
...
friend Matrix operator+( Matrix<r, c, F>& a, int b){
Matrix<r, c, F> temp;
int i, j;
for(i = 0; i < r; i++){
for(j = 0; j < c; j++){
temp.data[j+(i*c)] = a.data[j+(i*c)] + b;
}
}
return temp;
}
这段代码混淆了操作符的非成员和成员语法。
friend Matrix operator+( Matrix<r, c, F>& a, int b);
表示"有一个非成员函数可以访问我的内部文件"。但是您所定义的定义了一个成员函数,它应该具有语法
Matrix operator+(int b) {
因为this
是一个成员函数。有关讨论细微差别的示例,请参阅此回答。
同样,你的赋值操作符也不正确。
Matrix& operator=(const Matrix& a) {
是最常见的形式,尽管参数的格式可以改变,但您需要为返回值返回一个引用。
相关文章:
- c++中的重载赋值操作符
- c++类继承和赋值操作符
- 带引用类成员的赋值操作符
- 复制构造函数,赋值操作符重载
- c++派生类赋值操作符
- 通过调用Move赋值操作符实现Move构造函数
- 带有映射的赋值操作符
- 单参数构造函数和赋值操作符
- 如何从复制赋值操作符调用复制构造函数
- c++复制构造函数,重载赋值操作符,方法get()
- 用于具有const数据成员的类的move和右值赋值操作符
- 类赋值操作符和复制构造函数
- 赋值操作符重载
- 影响正确性的move构造函数/赋值操作符示例
- 当类是子类时重载赋值操作符
- 如果没有定义Move语义(Move构造函数和Move赋值操作符),编译器是否默认优化
- 在类赋值操作符函数中,为什么必须返回*this ?
- 模板类的重载赋值操作符
- 使用重载赋值操作符
- 类和向量的重载赋值操作符