从C++变量中删除'const'以后会导致我出现问题吗?

Will removing 'const' from a variable in my C++ cause me issues later on?

本文关键字:问题 变量 C++ 删除 const      更新时间:2023-10-16

我正在调试一些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的存在只是为了防止您在方法中更改"数据"。