[C ++中的常量到非常量转换

问题描述 投票:49回答:4

这些天我真的很讨厌const关键字,因为我不太熟悉它。我有一个向量,它存储所有像vector<const BoxT<T> *> *Q_exclude这样的const指针,并且在另一个类的构造函数中,我需要将此队列中的一个元素作为参数传递并将其分配给非const成员。我的问题是:

如何将const变量分配给非const变量?我知道这没有任何意义,因为毕竟const是const,因此无论如何都不应更改。但是,在此过程中确实必须更改该烦人的成员变量!我也可能将向量中的数据类型更改为非常量,但这会花费太多精力。还是有人知道如何避免这种情况?

c++ const
4个回答
91
投票
copying并因此创建了一个新对象,所以不会违反const ness。

Like so:

int main() { const int a = 3; int b = a; }

It's different,如果要获取指针或引用,则为原始const对象:[]

int main() {
   const int a = 3;
   int& b = a;       // or int* b = &a;
}

//  error: invalid initialization of reference of type 'int&' from
//         expression of type 'const int'

如果确实需要,您可以使用const_cast来绕过类型安全性,但是请记住,您确实在这样做:摆脱类型安全性。 still

尚未定义,无法在a中通过b修改the below example
int main() {
   const int a = 3;
   int& b = const_cast<int&>(a);

   b = 3;
}

尽管它编译时没有错误,但是任何事情都可能发生,包括开黑洞或将所有来之不易的积蓄转入我的银行帐户。如果您已经达到了执行此操作的要求,那么我将紧急重新审查您的设计,因为它有问题。

更改常量类型将导致

未定义行为。
但是,如果您有一个原始的非常量对象,该对象由指向常量的指针指向或由指向常量的引用引用,则可以使用

const_cast

来消除该常量。放弃常量被认为是邪恶的,应避免

not

。如果要通过向量修改数据,则应考虑将向量中使用的指针的类型更改为非常量。

丢弃指针的常数的实际代码为:

BoxT<T> * nonConstObj = const_cast<BoxT<T> *>(constObj);
但是请注意,这确实是在作弊。更好的解决方案是弄清楚为什么要修改const对象,然后重新设计代码,这样就不必...。或者从向量中删除const声明(如果事实证明您不这样做)真的希望这些项目毕竟是只读的。

void SomeClass::changeASettingAndCallAFunction() const { someSetting = 0; //Can't do this someFunctionThatUsesTheSetting(); }

另一种解决方案是在对const函数使用的变量进行编辑之间调用该函数。这个想法解决了我的问题,因为我不愿意更改函数的签名,而不得不使用“ changeASettingAndCallAFunction”方法作为中介:
[当您调用该函数时,您可以先在调用之前对设置进行编辑,或者(如果您不希望弄乱调用位置,则可以在需要更改该变量的情况下进行传播(如果您不喜欢调用该位置,就像我的情况一样。
void SomeClass::someFunctionThatUsesTheSetting() const {
     //We really don't want to touch this functions implementation
     ClassUsesSetting* classUsesSetting = ClassUsesSetting::PropagateAcrossClass(someSetting);
     /*
         Do important stuff
     */
}

void SomeClass::changeASettingAndCallAFunction() const {
     someFunctionThatUsesTheSetting();
     /*
         Have to do this
     */
}

void SomeClass::nonConstInvoker(){
    someSetting = 0;
    changeASettingAndCallAFunction();
}

现在,当调用对“ someFunctionThatUsesTheSetting”的某些引用时,它将以对someSetting的更改来调用。


9
投票

5
投票

1
投票
© www.soinside.com 2019 - 2024. All rights reserved.