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

时间:2015-06-19 09:09:49

标签: c++ const

我正在调试一些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;
    }
}

5 个答案:

答案 0 :(得分:3)

好的,您更新了代码,因此......由于引用传递data,您的更改不仅会让您对外部的任何代码产生副作用(所以...不可预知的副作用),但是你将通过要求函数的参数不是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只是为了防止你改变方法中的“数据”。