构造函数中的 const_cast 可接受

Posted

技术标签:

【中文标题】构造函数中的 const_cast 可接受【英文标题】:const_cast in constructor acceptable 【发布时间】:2011-01-21 09:38:19 【问题描述】:

这是对 const_cast 的有效使用吗?我在构造函数中使用它,它看起来如下:

KeyLiteObject(const char * extension, const char * swap_suffix)
        :    _extension(extension),
             _swap_suffix(swap_suffix),
             _swap_suffix_extension(swap_suffix) 

    const_cast<std::string*>(&_swap_suffix_extension)->append(_extension);

是的,字符串永远不会改变。

【问题讨论】:

【参考方案1】:

假设 _swap_suffix_extension 是一个 const std::string 那么为什么不这样做呢:

KeyLiteObject(const char * extension, const char * swap_suffix)
        :    _extension(extension),
             _swap_suffix(swap_suffix),
             _swap_suffix_extension( std::string( swap_suffix ) + std::string( extension ) ) 


那么你就可以完全避免 const_cast ...

【讨论】:

只是为了记录,冒着让初学者更困惑的风险,但更简洁,你可以让字符串连接的一侧是一个 std::string 对象:@ 987654322@. 如果我没有一个被定义为字符串的对象,那么在构造函数主体中使用 const_cast 是否可以接受? @Tony:是的,我知道,我差点就离开了。我只是认为上面的内容更明显。我想它可能会更慢,但这取决于“std::string::operator + (std::string, char*)”是否在使用普通(std::string, std::string ) 添加与否... 顺便说一句/另一种方法是使 swap_suffix 和/或扩展参数const std::string&amp; - 然后您不仅仍然可以传递 char* 值并隐式构造字符串,而且您可以将它们连接起来而不需要任何不直观的代码。 @Hassan:在我看来(人们可能不同意)你永远不应该使用 const_cast。如果你需要使用它,那么你的设计就有缺陷。事实上,它只是被引入来处理没有以适当的 const 正确性编写库的情况。这样,您实际上可以继续生活,而不必提出请求来修复库代码(如果它确实受到积极支持的话)。【参考方案2】:

尽可能避免使用const_cast,这里对于任何给定的类型都是很有可能的。只需创建一个辅助函数,它接受两个参数,组成常量的最终值并在初始化器中使用它:

// header file
struct test  
   const type x; 
   test( type const & a, type const & b );
;
// implementation file
namespace 
   type compose( type const & arg1, type const & arg2 ) 
      // calculate the actual value here
   

test::test(type const & a, type const & b) 
      : x( compose(a,b) ) 
 

这样做的代价只是在实现文件中编写一个免费的(static 或在未命名的命名空间中)函数,如果您为函数选择合适的名称,则结果是可读的。在您的情况下:concatenateconcat 将是不错的选择。

虽然在示例中使用 const_cast 不会导致未定义的行为,但出于个人原因,我会避免使用它。使用 C++(与 C 或 Java 相比)编写强制转换很麻烦,原因是:它们会引起程序员的注意:这里发生了一些奇怪的事情!如果你开始使用强制转换,那么你会习惯于看到它们,它们会变得自然。

【讨论】:

以上是关于构造函数中的 const_cast 可接受的主要内容,如果未能解决你的问题,请参考以下文章

Python 构造一个可接受任意数量参数的函数

explicit构造函数

explicit构造函数

javascript中的多个构造函数

python构造函数

c++中的类型转换