从C++变量中删除'const'以后会导致我出现问题吗?
Will removing 'const' from a variable in my C++ cause me issues later on?
我正在调试一些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;
}
}
好的,你更新了你的代码,所以...由于data
是通过引用传递的,因此您的更改不仅会让您对函数之外的任何代码造成副作用(因此...不可预测的副作用),但您将通过要求函数的参数不是 const 来破坏函数的 API。
从我的C++变量中删除"const"以后会导致我出现问题吗?
这实际上取决于您打算使用该变量做什么。
我现在想更改此函数中变量数据的值。据我了解,我将无法执行此操作,因为数据已作为 const 传递给函数。
如果你只删除const
,你在函数中收到的"数据"将是原始变量的副本。因此,即使您更改它,原始变量也将保持不变。
要修改原始变量,您需要使用引用(如果始终提供数据)或指针(如果数据是可选的)
从参数中删除关键字 const 除了允许我更改函数内的数据值之外,还会有什么影响?
删除 const 参数将增加产生错误的机会,这可能会浪费您的时间。示例" (data = x)
而不是(data == x)
。使用 const 后,无论您的编译器如何,您都会立即发现此问题。这是唯一的副作用。
这是否有可能破坏代码的其他部分?
这取决于函数的内容。例如,如果你在函数中获取一个指向(引用)非常量数据的指针,将该指针存储在全局变量中,稍后在其他地方通过该指针访问该数据,它几乎肯定会破坏大量代码。
删除 const 关键字时应注意哪些陷阱?
Const是为程序员提供的保障。 const
减少了犯错的机会。通过删除 const,您可以增加犯错误的机会。如果non-const
参数是按值传递的,则该错误几乎相当于意外修改参数,并且这些影响将包含在函数中。如果参数是引用non-const
则会影响意外修改是否在其外部可见。
还有许多方法可以通过外部/全局变量传递(警告:糟糕的编程实践)指向参数的指针,同时射击自己的双脚。这几乎肯定会造成一团糟。
通常,您希望保留所有引用参数 const,除非必须更改它们。
对于简单的数据类型(例如 int),保留值参数 const 并不是绝对必要的,但如果随机修改的可能性很高,这是值得的。
您还需要保留所有不更改类内部状态的类方法const
。
像这样的小事情可以让你控制代码库变得非常大的情况。
它可能有任何影响,例如
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
,则可能会测试与预期测试不同的内容,因为执行的代码可能完全不同。
从引用参数中删除const
与从值参数中删除它有很大不同。
后者主要是为了阻止你做一些愚蠢的事情,但你提出的是一个相当大的界面更改,因为关于参数可变性的假设不再有效。在进行此类更改之前,您应该考虑 setRequest 的所有用法,并查看它是否会破坏任何客户端代码。
如果您可以看到没有代码会受到它的影响,请继续进行更改。这将包括更新所涉及的任何文档,甚至可能更新函数名称。
没问题,只要你按值传递"数据"。 Const的存在只是为了防止您在方法中更改"数据"。
- 为"adjacent"变量赋值时出现问题
- C++理解计算字符变量的问题
- 在通知提升间处理条件变量时未按住锁会导致问题
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 将十六进制值设置为用于填充的字符变量时出现问题
- 初学者问题:如何访问此变量?
- 关于仅正确使用二传手和变量的问题
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 将字符数组转换为结构时出现问题. 结构的字符数组变量溢出
- 在 for 循环中更新两个变量时遇到问题C++
- 为<vtkDataArray> VTK 非结构化网格声明 vtkSmartPointer 类型的变量时出现问题
- 模板类编译问题与 typedef 变量
- 简单的问题 - 如何从单独的"结构"内的'class'访问变量?
- c++问题:给一个变量赋值后,另一个变量发生了变化
- 初学者问题:C++指针/地址 - 和变量之后不是以前?
- 关于读取有效 c++ 第 4 项(将非局部静态变量替换为局部静态变量)的问题
- 我有几个关于参考变量的问题
- 面临在 if 语句之外打印变量数据的问题 完成使用 Qt 编程
- OpenCV C++ Mat 类行和列 - 它们是成员变量(和相关问题)吗?
- 指向动态内存中结构中的变量时出现问题