gpt4 book ai didi

按值调用函数的 C++ 奇怪行为

转载 作者:搜寻专家 更新时间:2023-10-31 01:49:41 25 4
gpt4 key购买 nike

我有一个对象,它是 GNU 科学图书馆中矩阵结构的类接口(interface)

typedef double real_t;
typedef unsigned short index_t;
class matrix
{
gsl_matrix* m;
public:
matrix(index_t rows, index_t columns, real_t val);
}

matrix::matrix(index_t rows, index_t columns, real_t val)
{
m=gsl_matrix_alloc(rows,columns);
gsl_matrix_set_all(m, val);
return;
}

index_t matrix::rows(void)
{
return m->size1;
}

index_t matrix::columns(void)
{
return m->size2;
}

问题是,如果我使用像这样按值获取矩阵对象的函数:

void test_function(const matrix m){};

并在像这样的程序中使用它

int main()
{
matrix m(4,4,1);
cout << m.rows() << '\t' << m.columns() << endl;
test_function(m);
cout << m.rows() << '\t' << m.columns() << endl;
}

我惊奇地发现矩阵对象m的行数被函数test_function修改为垃圾值,即使我在参数前加上关键字const并且按值调用.但最奇怪的是,如果我使用像这样的通过引用调用的函数:

void test_function(const matrix &m){};

什么都没发生,一切似乎都很好。

据我所知,按值调用不应该能够修改函数的参数,特别是如果函数像这种情况一样什么都不做,尤其是如果我在函数原型(prototype)中的参数名称之前明确使用关键字 const...

如有任何帮助,我们将不胜感激。

编辑:

我还为矩阵类定义了复制构造函数

matrix& matrix::operator= (const matrix& src)
{
gsl_matrix_memcpy(m,src.m);
return *this;
}

它执行 gsl_matrix 结构的完整拷贝(我猜)

编辑:

好吧,我想我终于明白了:按值调用函数创建了一个浅拷贝对象,它只包含指向真实对象的指针,当test_function终止时所有局部变量都被销毁,所以矩阵类的析构函数(已定义但为简洁起见此处省略)被调用,但通过这种方式,main 中的对象(局部 m 指向的对象)与局部变量一起被销毁。无论如何,我解决了定义适当的问题复制构造函数执行对象的完整(深)复制,然后使用引用调用,这对于繁重的计算应该更好。非常感谢大家的帮助!

最佳答案

因为默认的copy ctor只是做一个浅拷贝,也就是说,它只是复制指针m的值,而不是分配一个新的。

关于按值调用函数的 C++ 奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16209794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com