我正在调试一些C ++代码,并希望在特定函数中更改变量的值。该变量使用const
关键字作为参数传递给函数,例如:
void setRequest(const &data){
...
}
我现在想要在此函数中更改变量data
的值。据我了解,我无法执行此操作,因为data
已作为const
传递给函数。
我想知道的是,除了允许我更改函数内部const
的值之外,从参数中删除关键字data
的效果是什么?是否有可能会破坏代码的其他部分?在删除const
关键字时,我应该注意哪些陷阱?
显然这样做会影响使用data
变量的任何其他函数,但鉴于它所保存的信息将始终是相同的类型,我不会认为它会导致任何重大问题 - 这是正确的吗?
我想做的一个例子是:
void setRequest(&data){
...
bool match = false;
...
if(someCondition){
match = true;
}
if(match == true){
data = 1;
}
}
答案 0 :(得分:3)
好的,您更新了代码,因此......由于引用传递data
,您的更改不仅会让您对外部的任何代码产生副作用你的函数的em>(所以...不可预知的副作用),但是你将通过要求函数的参数不是const 来打破函数的API 。 / p>
答案 1 :(得分:1)
从我的C ++中的变量中删除'const'会在以后导致问题吗?
这实际上取决于您计划对该变量做些什么。
我现在想要更改此函数中变量数据的值。据我所知,我无法做到这一点,因为数据已经作为const传递给函数。
如果您只删除const
,则您在函数中收到的“数据”将是原始变量的副本。因此,即使您更改它,原始变量也将保持不变。
要修改原始变量,您需要使用引用(如果始终提供数据)或指针(如果数据是可选的)
是什么效果会从参数中删除关键字const而不允许我更改函数内的数据值?
删除const参数将增加制作可能浪费数小时的错误的机会。示例“(data = x)
而不是(data == x)
。使用const,无论编译器如何,都会立即捕获此问题。这是唯一的副作用。
是否有可能会破坏代码的其他部分?
这取决于你的功能的内容。例如,如果您在函数中使用指向(引用)非const数据的指针,将该指针存储在全局变量中,稍后通过该指针在其他地方访问该数据,则几乎肯定会破坏大量代码。
删除const关键字时我应该注意哪些陷阱?
Const是程序员的保障。 const
减少了犯错误的可能性。通过删除const,可以增加犯错误的几率。如果non-const
参数按值传递 ,则该错误几乎等同于意外修改参数,并且这些效果将包含在函数中。如果non-const
参数是参考,则会影响是否在其外部可见意外修改。
通过外部/全局变量传递(警告:错误的编程实践)指针,有很多方法可以同时用双脚射击自己。这几乎可以保证一团糟。
通常您希望将所有参考参数设为const,除非您 更改它们。
对于简单的数据类型(例如int),保持值参数const并不是绝对必要的,但如果随机修改的可能性很高,则值得。
您还希望保留所有不会更改类的内部状态const
的类方法。
当你的代码库变得非常大时,像这样的小事让你可以控制局面。
答案 2 :(得分:1)
它可能具有任何效果,例如
struct A {
void doSomething () { cout << "This called"; }
void doSomething () const { cout << "That called"; }
};
void callWithConst (const A data) { data.doSomething (); /* prints "That called" */ }
void callWithoutConst (A data) { data.doSomething (); /* prints "This called" */ }
这取决于data
的类型如何实现以及如何在函数中使用它。
与参考参数类似。
如果您出于测试目的而删除const
,则可能会测试与您打算测试的内容不同的内容,因为执行的代码可能完全不同。
答案 3 :(得分:1)
从引用参数中删除const
与从值参数中删除它非常不同。
后者主要是为了阻止你做一些愚蠢的事情,但你提出的是一个相当重要的界面变化,因为关于参数可变性的假设不再有效。您应该考虑setRequest的所有用法,看看它是否会在进行此类更改之前破坏任何客户端代码。
如果您发现没有任何代码会受到影响,请继续进行更改。这将包括更新所涉及的任何文档,甚至可能更新函数名称。
答案 4 :(得分:0)
只要你按价值传递'数据',你应该没事。 const只是为了防止你改变方法中的“数据”。