C++ C++;阵列的默认行为-浅拷贝?

C++ C++;阵列的默认行为-浅拷贝?,c++,C++,正如标题所说的-我需要v数组的内容在函数之外不要更改 我认为这不会发生(因为阵列的默认行为是深度复制,但看起来不是) #包括 使用名称空间std; void testModif(int*v) { 对于(int i=0;i, STD::向量< /> > .p/> 首先可以通过声明为来征集编译器帮助 void testModif(const int *v); 例如,作为指向const int的非常量指针的v。例如,您可以增加指针的副本,但不能更改指针指向的内容 更改后,显示的代码将出现错误/警告,

正如标题所说的-我需要v数组的内容在函数之外不要更改

我认为这不会发生(因为阵列的默认行为是深度复制,但看起来不是)

#包括
使用名称空间std;
void testModif(int*v)
{
对于(int i=0;i<5;i++)
{
v[i]++;
}
}
int main()
{
int*v;
v=新整数[100];
*v=0;
testModif(v);
对于(int i=0;i<5;i++)
{

cout首先,您可以通过声明为

void testModif(const int *v);
例如,作为指向
const int
的非常量指针的
v
。例如,您可以增加指针的副本,但不能更改指针指向的内容

更改后,显示的代码将出现错误/警告,这些错误/警告至少会告诉您正在做您不想做的事情

然后,您需要更改代码以遵循您的自主规则。
对于所显示的代码,需要创建数组本身的副本(不仅仅是指向它的指针的副本)。与您提到的“浅副本”相比,这将匹配“深度副本”

最接近您显示的代码的是本地副本、大小为5的数组(幻数,但您知道我的意思)或大小适当的malloced(当然在离开函数之前释放)

显然,制作一个本地副本,增加所有成员,然后再次离开函数似乎没有意义。我相信这完全是因为您制作了一个适当的MRE。也就是说,故意不改变原始值,只局部增加是您想要实现的


当然,我并不反对你的问题,它建议用标准容器来做更多的C++方法,比如“代码> STD::数组< /COD>,<代码> STD::向量< /> > .p/> 首先可以通过声明为

来征集编译器帮助
void testModif(const int *v);
例如,作为指向
const int
的非常量指针的
v
。例如,您可以增加指针的副本,但不能更改指针指向的内容

更改后,显示的代码将出现错误/警告,这些错误/警告至少会告诉您正在做您不想做的事情

然后,您需要更改代码以遵循您的自主规则。
对于所显示的代码,需要创建数组本身的副本(不仅仅是指向它的指针的副本)。与您提到的“浅副本”相比,这将匹配“深度副本”

最接近您显示的代码的是本地副本、大小为5的数组(幻数,但您知道我的意思)或大小适当的malloced(当然在离开函数之前释放)

显然,制作一个本地副本,增加所有成员,然后再次离开函数似乎没有意义。我相信这完全是因为您制作了一个适当的MRE。也就是说,故意不改变原始值,只局部增加是您想要实现的


当然,我并不反对你的问题,它建议用标准容器来做更多的C++方法,比如“代码> STD::”代码< >代码:STD::向量。
,它具有正确的值语义,而不是像普通数组那样容易衰减为指针,因此通过值将其传递到
testModif
,它将更新自己的本地副本,而不是原始副本。如何在运行testModif后使v不发生更改?使用
std::array
std::vector
,它们支持深度协同pies.如果您使用而不是C样式数组,那么您可以选择使用值或引用语义来选择是否应复制数组。使用
std::array
的另一个很好的原因是您可能忘记了
delete[]v
。哦,等等,您确实忘记了。在
中,void testModif(int*v) > <代码> v>代码>是否像数组?C++中不能有一个数组作为参数,所以深拷贝或浅拷贝的问题是不相关的。好,你通过一个指针,所以它更新指向数组,而不是复制它。你还期望什么?答案是使用<代码> STD::数组< /代码>,它有适当的。值语义,而不是像普通数组那样容易衰减为指针,因此通过值将其传递到
testModif
,它将更新自己的本地副本而不是原始副本。如何在运行testModif后使v不发生更改?使用
std::array
std::vector
,它们支持深度副本。如果改用对于C样式数组,这将使您可以选择使用值或引用语义来选择是否应复制数组。使用
std::array
的另一个很好的理由是您可能会忘记
delete[]v
。哦,等等,您确实忘记了。在
中,void testModif(int*v) > <代码> v>代码>是否像数组?你不能将数组作为C++中的函数的参数,所以深拷贝或浅拷贝的问题是无关的。是的,因为我想做一个合适的MRE。我从你的文章中了解到,我必须创建另一个数组来保存初始值。这是什么?你的意思是?是的,没错。(虽然我不会将复制的值描述为“初始”值,当然不会在你更改它们之后。如果你允许挑剔,我会将它们描述为“原始值的副本”).为了制作一个C型数组,你需要知道大小,看起来是5。如果没有常数幻数,像这样的事情通常是通过函数的第二个参数来完成的,给出大小。不要担心,当我写“适当的MRE”时,我真的