从我的 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
.
传递给函数
我想知道的是,除了允许我在函数内更改 data
的值之外,从参数中删除关键字 const
有什么影响?这是否有可能破坏代码的其他部分?删除 const
关键字时应注意哪些陷阱?
显然这样做会影响使用 data
变量的任何其他函数,但考虑到它保存的信息将始终是同一类型,我不认为它会导致任何重大问题 -这是正确的吗?
我想做的一个例子是:
void setRequest(&data){
...
bool match = false;
...
if(someCondition){
match = true;
}
if(match == true){
data = 1;
}
}
只要按值传递 'data' 就应该没问题。 const 只是为了防止您在方法内部更改 'data' 。
好的,你更新了你的代码,所以......因为 data
由 reference 传递,你的更改不仅会让你对任何代码产生副作用 在你的函数之外(所以......不可预测的副作用),但是你会通过要求参数来破坏你的函数的API函数 不是 const.
Will removing 'const' from a variable in my C++cause me issues later on?
这实际上取决于您打算如何处理该变量。
I now want to change the value of the variable data inside this function. As I understand, I won't be able to do this because data has been passed to the function as const.
如果您只删除 const
,您在函数中收到的 "data" 将是原始变量的副本。所以,即使你改变了它,原来的变量将保持不变。
要修改原始变量,需要使用引用(如果始终提供数据)或指针(如果数据是可选的)
is what effects will removing the keyword const from the parameter have other than allowing me to change the value of data inside the function?
删除 const 参数会增加产生错误的可能性,这可能会浪费您数小时的时间。示例“(data = x)
而不是 (data == x)
。有了 const,你会立即发现这个问题,不管你的编译器是什么。这是唯一的副作用。
Is there the possibility that this will break some other part of the code?
这取决于你的功能的内容。例如,如果您在函数中获取指向(引用)非常量数据的指针,将该指针存储在全局变量中,稍后通过该指针在其他地方访问该数据,几乎肯定会破坏很多代码。
What are the pitfalls that I should look out for when removing the const keyword?
Const是为程序员做的一个保障。 const
减少犯错的机会。通过删除 const,您会增加犯错的机会。如果 non-const
参数通过 值 传递,则该错误几乎等于参数的意外修改,并且这些影响将包含在函数中。如果 non-const
参数是 reference,那么它会影响意外修改是否在它之外可见。
还有许多方法可以通过 external/global 变量传递(警告:错误的编程习惯)指向您的参数的指针来同时用双脚射击自己。这几乎可以保证会造成很大的混乱。
一般来说,您希望保留所有 reference 参数,除非您 需要更改它们。
对于简单的数据类型(例如 int),将 value 参数保持为 const 并非绝对必要,但如果随机修改的可能性很高,则值得这样做。
您还需要保留所有不改变 class 内部状态 const
的 class 方法。
当您的代码库变得非常大时,像这样的小事情可以让您控制情况。
它可能有任何效果,例如
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 的所有用途,看看它是否会破坏任何客户端代码。
如果您发现没有任何代码会受到它的影响,那么继续进行更改。这将包括更新涉及的任何文档,甚至可能是函数名称。
我正在调试一些 C++ 代码,并想更改特定函数内变量的值。该变量作为参数传递给使用 const
关键字的函数,例如:
void setRequest(const &data){
...
}
我现在想更改此函数中变量 data
的值。据我了解,我将无法执行此操作,因为 data
已作为 const
.
我想知道的是,除了允许我在函数内更改 data
的值之外,从参数中删除关键字 const
有什么影响?这是否有可能破坏代码的其他部分?删除 const
关键字时应注意哪些陷阱?
显然这样做会影响使用 data
变量的任何其他函数,但考虑到它保存的信息将始终是同一类型,我不认为它会导致任何重大问题 -这是正确的吗?
我想做的一个例子是:
void setRequest(&data){
...
bool match = false;
...
if(someCondition){
match = true;
}
if(match == true){
data = 1;
}
}
只要按值传递 'data' 就应该没问题。 const 只是为了防止您在方法内部更改 'data' 。
好的,你更新了你的代码,所以......因为 data
由 reference 传递,你的更改不仅会让你对任何代码产生副作用 在你的函数之外(所以......不可预测的副作用),但是你会通过要求参数来破坏你的函数的API函数 不是 const.
Will removing 'const' from a variable in my C++cause me issues later on?
这实际上取决于您打算如何处理该变量。
I now want to change the value of the variable data inside this function. As I understand, I won't be able to do this because data has been passed to the function as const.
如果您只删除 const
,您在函数中收到的 "data" 将是原始变量的副本。所以,即使你改变了它,原来的变量将保持不变。
要修改原始变量,需要使用引用(如果始终提供数据)或指针(如果数据是可选的)
is what effects will removing the keyword const from the parameter have other than allowing me to change the value of data inside the function?
删除 const 参数会增加产生错误的可能性,这可能会浪费您数小时的时间。示例“(data = x)
而不是 (data == x)
。有了 const,你会立即发现这个问题,不管你的编译器是什么。这是唯一的副作用。
Is there the possibility that this will break some other part of the code?
这取决于你的功能的内容。例如,如果您在函数中获取指向(引用)非常量数据的指针,将该指针存储在全局变量中,稍后通过该指针在其他地方访问该数据,几乎肯定会破坏很多代码。
What are the pitfalls that I should look out for when removing the const keyword?
Const是为程序员做的一个保障。 const
减少犯错的机会。通过删除 const,您会增加犯错的机会。如果 non-const
参数通过 值 传递,则该错误几乎等于参数的意外修改,并且这些影响将包含在函数中。如果 non-const
参数是 reference,那么它会影响意外修改是否在它之外可见。
还有许多方法可以通过 external/global 变量传递(警告:错误的编程习惯)指向您的参数的指针来同时用双脚射击自己。这几乎可以保证会造成很大的混乱。
一般来说,您希望保留所有 reference 参数,除非您 需要更改它们。
对于简单的数据类型(例如 int),将 value 参数保持为 const 并非绝对必要,但如果随机修改的可能性很高,则值得这样做。
您还需要保留所有不改变 class 内部状态 const
的 class 方法。
当您的代码库变得非常大时,像这样的小事情可以让您控制情况。
它可能有任何效果,例如
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 的所有用途,看看它是否会破坏任何客户端代码。
如果您发现没有任何代码会受到它的影响,那么继续进行更改。这将包括更新涉及的任何文档,甚至可能是函数名称。