c++ - 为什么返回一个对象会改变 C++ 中该对象的内容?
问题描述
我是 C++ 和 Stackoverflow 的新手,所以要温柔,但如果我的代码或帖子有问题,请告诉我。
这是我的问题:我正在尝试构建一个矩阵类,其中包含一个一维数组(值)和两个 int(维度)。问题出现在将矩阵相乘的方法中,更准确地说是当我尝试返回结果时:
生成的矩阵在乘法方法内具有正确的系数,但系数在方法之外神奇地变成了垃圾,主要是。
这是我的课:
class Matrice {
public:
// attributes :
double* values;
unsigned dim1;
unsigned dim2;
// Methods :
Matrice(double[], int, int);
double getVal(int, int);
void setVal(int, int, double);
void printValues();
double computeCoeff(int , int, Matrice);
Matrice mult(Matrice B);
};
现在这里是乘法方法的代码:
Matrice Matrice::mult(Matrice B){
int tabSize = dim1*(B.dim2);
double matTab[tabSize];
for(int i=0; i<dim1;i++){
for(int j=0; j<B.dim2;j++){
matTab[i*B.dim2+j]=computeCoeff(i, j, B);
}
}
Matrice C = Matrice(matTab, dim1, B.dim2);
std::cout<<"before the return :"<<std::endl;
C.printValues();
return C;
}
现在我们进入有趣的部分。当我创建两个矩阵实例并将它们与以下代码相乘时:
int main(){
double matA[12] = {1, 2, 3,
4, 5, 6,
7, 8, 9,
10, 11, 12};
Matrice A = Matrice(matA, 4, 3);
double matB[6] = {1, 1,
1, 1,
1, 1};
Matrice B = Matrice(matB, 3, 2);
Matrice C = A.mult(B);
std::cout<<"after the return :"<<std::endl;
C.printValues();
return 0;
}
我在控制台中收到以下文本:
before the return :
dim1 = 4
dim2 = 2
6 6
15 15
24 24
33 33
after the return :
dim1 = 4
dim2 = 2
1.81868e+231 1.73843e-310
1.96491e+231 1.81504e-307
1.30394e+231 1.81488e-307
1.85708e+231 1.82192e-307
正如您可能已经猜到的那样,第一个矩阵是具有良好系数的矩阵,而第二个矩阵中的系数是垃圾。看起来在返回时它复制了两个整数,但创建了一个新数组而没有将其值分配给任何东西,我真的不知道为什么。由于返回之前的矩阵是正确的,我假设其他方法都不是罪魁祸首。
当我在论坛上查看如何返回对象时,人们说可以使用花哨的指针来避免复制对象,但总的来说,返回对象是可以的。显然在大多数情况下,编译器甚至不需要实际复制对象,然后返回一个对象,真的没问题(或者是吗?)。
我真的很想了解它是如何工作的,所以欢迎任何帮助。
编辑 :
其他方法:
构造函数:
Matrice::Matrice(double givenValues[], int givenDim1, int givenDim2){
values = givenValues;
dim1 = givenDim1;
dim2 = givenDim2;
}
getVal、setVal、computeCoeff 和 printValues 方法:
double Matrice::getVal(int i, int j){
return values[i*dim2+j];
}
void Matrice::setVal(int i, int j, double val){
values[i*dim2+j] = val;
}
double Matrice::computeCoeff(int i, int j, Matrice B){
double coef=0;
for(int k=0; k<dim2;k++){
coef+=getVal(i, k)*B.getVal(k, j);
}
return coef;
}
void Matrice::printValues(){
std::cout << "dim1 = "<<dim1<<std::endl;
std::cout << "dim2 = "<<dim2<<std::endl;
for(int i=0; i<dim1;i++){
for(int j=0; j<dim2;j++){
std::cout<<getVal(i, j)<< " ";
}
std::cout<<std::endl;
}
}
解决方案
推荐阅读
- javascript - 是否存在 JavaScript 的 forEach 在 for 循环不起作用的情况下?
- sql - Snowflake 插入“覆盖”是否会影响 STREAM 捕获更改的方式
- r - 渲染 Hugo/blogdown 网站的问题
- html - 将 html ngModel 值传递给服务
- javascript - 单击按钮从数组中删除对象
- .net - 加密列后 SQL 查询性能下降
- python - 当我更改其属性时,验证生成器的准确性几乎会下降——keras ImageDataGenerator、model.evaluate
- python - 使用 Pandas 在另一个数据框中基于 SumIf 计算创建新数据框
- java - 如何对命令中的表情做出反应 (Discord JDA)?
- r - 在两个 data.tables 之间添加和相乘公共元素