2010-08-04 21 views
2

关于C++中常量与非常量版本之间的区别,我有几个问题。C++中常量与非常量版本的方法之间的差异

例子:

 MyObject* MyClass::objectReference() 
const MyObject* MyClass::objectReference() const 

我的问题是:

  1. 有什么办法都来区分该方法的版本之间手动叫什么名字?或者它是完全/完全自动的,如果有的话,确定哪个版本被调用的规则是什么?
  2. 与(1)相关,如果不能区分是调用常量还是非常量版本,那么就不可能从另一个方法调用一个方法的一个版本来防止重复?
  3. 如何在使用doxygen的方法之一的文档中创建一个版本或另一个版本的链接? (例如“myMethod的const版本()。”或“myMethod()的非常量版本”)。我自己发现了这一点 - 只需在方法签名末尾添加或省略“const”即可。
+1

我建议* * 3 *做一个不同的问题 - 最后是Doxygen特定的,而前者是一般的C++问题。分开*#1 *和*#2 *可能会更好。 – 2010-08-04 02:55:59

+0

#2只是#1的一个特例,其中所讨论的对象是'this'指向的对象。不过,我绝对同意#3应该有自己的问题。 – bcat 2010-08-04 02:58:29

+0

@bcat:嗯,因此*可能* - 实现共享本身就是一个有趣的问题:[#1](http://stackoverflow.com/questions/407100/calling-a-const-function-from-a非常量对象),[#2](http://stackoverflow.com/questions/1333849/how-to-generate-a-non-const-method-from-a-const-method),[# 3](http://stackoverflow.com/questions/856542/elegant-solution-to-duplicate-const-and-non-const-getters),... :) – 2010-08-04 03:07:30

回答

5

我不知道doxygen;尽管这是我所知道的。

  1. 如果仅仅有一个非const版本,它根本不能在const对象上调用。
  2. 如果只有const版本,则可以在const和非const对象上调用该版本。
  3. 如果同时存在,非const版本将在非const对象上调用,并且const版本将在const对象上调用。
  4. 如果你想显式调用const一个,你有你的对象转换为自身的常引用:static_cast<const MyClass&>(myObject).objectReference();
+1

你会使用'const_cast'吗? – Anthony 2010-08-04 02:59:55

+4

@Duracell:我宁愿使用'const_cast'来删除'const'修饰符,因为'static_cast'在添加它时做得非常好。 – zneak 2010-08-04 03:01:28

+3

@Duracell @zneak:这是[implicit_cast'函数模板]的一个很好的用例(http://stackoverflow.com/questions/868306/what-is-the-difference-between-static-cast-and-隐铸/ 869597#869597)。 – 2010-08-04 03:09:23

1

虽然,调用非const方法上const实例可能是不明智的。但是,如果您想在非const实例上调用const方法,则只需使用强制转换。以下程序为例:

#include <iostream> 

class ConstTest { 
public: 
    void cows() const { 
    std::cout << "const method call" << std::endl; 
    }; 

    void cows() { 
    std::cout << "non-const method call" << std::endl; 
    } 
}; 

int main() { 
    ConstTest ct; 

    ct.cows();         // Prints "non-const method call" 
    static_cast<const ConstTest &>(ct).cows(); // Prints "const method call" 
}