行为

2012-02-03 20 views
1

我在C++行为

1.首先奇怪的事情我无法理解的是

的const_cast运算符的语法即

阅读的const_cast操作-const_cast-- < - 类型 - > - ( - 表达式 - )--------------------> <

我有什么都懂这个语法是,它有助于抛弃常量性Type类型的expression的。但考虑下面的代码

class ConstTest { 

private: 
    int year; 
public: 
    ConstTest() : year(2007) {} 
    void printYear() const; 
}; 

int main() { 
    ConstTest c; 
    c.printYear(); 
    return 0; 
} 

void ConstTest::printYear() const { 
    ConstTest *c = const_cast<ConstTest*>(this); 
    c->year = 42; 
    std::cout << "This is the year " << year << std::endl; 
} 

这里排队ConstTest *c = const_cast<ConstTest*>(this),我认为常量this指针应该被抛弃,但输出显示它是this所指的失去其常量的对象。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this),但是这会产生一个错误。我知道在很多解释中我错了。请纠正它们。

2.my第二个问题是如下

给出的const_cast表达式的结果的语句是一个rvalue除非类型是引用类型。在这种情况下,结果是一个左值。

这是为什么,以及为什么它不是真的指针?

+0

最好避免const_cast,直到你理解语言好得多。它的使用是非常危险的。 – 2012-02-03 17:36:23

回答

4

它有助于铸造型类别

没有的表达远常量性,Type是结果的类型,而不是操作数的类型。

什么,我认为是这个指针的常量应远离铸造

this的类型为const ConstTest*const_cast<ConstTest*>(this)有型号ConstTest*。这就是“从const指针转换const”的方法。

我觉得代码应该是ConstTest *c = const_cast<ConstTest>(*this)

const_cast<T>结果的类型T,这就是它如何定义的。也许你会有不同的定义,但运气不好,你没有通过编写const_cast<ConstTest>得到ConstTest*,你通过编写const_cast<ConstTest*>得到它。您的首选语法不可用。

你可以做ConstTest &c = const_cast<ConstTest&>(*this)ConstTest *c = const_cast<ConstTest*>(this),所以选择你最喜欢的。

const_cast表达式的结果是一个右值,除非类型是 引用类型。在这种情况下,结果是一个左值。

为什么这样以及为什么它不是真的在指针的情况下?

这是真的指针。 ConstTest*不是引用类型,并且const_cast<ConstTest*>(this)的结果是右值。然后将该值分配给变量c

+0

感谢您的答案。 – 2012-02-04 05:07:33

+0

不应该'这是'ConstTest * const'? 'const constTest *'意味着被指向的数据是常量,因此不能被修改。还有什么是ref类型的例子? const_cast const constTest&(* this)是一个ref类型的结果吗?这不能是一个左值,因为你不能分配给它。 – greatwolf 2013-07-14 05:43:46

+0

@greatwolf:我的意思是我在'printYear'成员函数中写的'this'的类型为'const ConstTest *'。这确实意味着“指向常量”,虽然有一个指向常量不*意味着指向的数据不能被修改。这只是意味着你不能通过该指针进行修改。 'const_cast (* this)'的结果确实是一个左值,并且具有引用类型。当你说如果不能分配某些东西时,你是错误的,因此它不能是一个左值。有可修改和不可修改的左值。 – 2013-07-15 22:31:31