关于C ++常量语法的简单问题

时间:2010-04-27 02:32:43

标签: c++ function constants

这是从Thinking in C ++ Vol1第10章中复制的一些代码。

   #include <iostream>
   using namespace std;

   int x = 100;

   class WithStatic {
        static int x;
        static int y;
        public:
             void print() const {
             cout << "WithStatic::x = " << x << endl;
             cout << "WithStatic::y = " << y << endl;
           }
  };

函数print()的const是什么意思?谢谢!

7 个答案:

答案 0 :(得分:3)

我之前听说这是“一种不会在逻辑上改变对象的方法”。这意味着通过调用此方法,调用方可以在方法返回后期望对象的状态保持不变。实际上,this指针成为指向该类的常量实例的常量指针,因此不能更改成员变量。此规则的例外是成员变量是使用mutable声明的。如果一个类有mutable个成员变量,那么这些变量可以通过非const和const方法进行修改。此外,不能从const方法中调用非const方法。

有些人使用mutable成员变量来缓存及时计算的结果。理论上,对象的状态不会改变(即唯一的影响是后续调用更快,但是在给定相同输入的情况下它们会产生相同的结果)。

答案 1 :(得分:2)

这意味着它不会更改类的任何成员变量。

http://www.parashift.com/c++-faq-lite/const-correctness.html

答案 2 :(得分:1)

保证函数根本不会修改对象(即它是“只读”函数)。编辑:显然,该规则的例外是对象有mutable个成员;那些可以通过const和非const函数来改变。

另外,我很高兴看到其他人从TIC ++学习。这对初学者来说是一个很好的资源。

答案 3 :(得分:1)

它的作用是有效地使this指针成为const的const指针,而不是指向非const的const指针。所以,只要你在const成员函数中引用this - 无论是显式还是隐式 - 你都使用const指针指向const。

所以,对于你在这里的类,在任何非const函数中,this的类型是WithStatic const *,而在const函数中,它的类型是const WithStatic * const

与任何指向const的指针一样,你不能改变它所指向的任何东西。因此,您不能更改其任何成员变量,也不能调用其任何非const成员函数。

一般来说,如果你能合理地将成员函数设为const是个好主意,因为它保证你不会改变对象的状态,你可以用const对象来调用它。 / p>

如果成员变量是mutablevolatile 可能会被更改,但这些更高级的主题可能会更好地避免,直到你成为更熟悉这门语言。当然,你通常不需要担心它们,除非你需要,否则不应该使用它们。也可以抛弃this指针的常量,此时你可以改变它,但IIRC,那是未定义的行为,而且它通常被认为是一个坏主意。因此,有些情况下可以在const成员函数中更改对象的状态,但通常不可能并且最好避免使用它。

当你创建一个成员函数const时,你有效地承诺该函数调用不会改变对象的状态(尽管显然可能存在副作用,因为你可以调用像{{1这样的函数这样的事实}})。

答案 4 :(得分:1)

如果成员函数声明为“const”,则表示该函数不会修改对象的状态。这样:

       
  • 记录函数不会修改状态的事实(对其他开发人员有用)。
  •    
  • 允许编译器进行优化,因为知道其他“const”函数的结果不会因调用该函数而改变(允许函数调用从循环中取出)。
  •    
  • 当const引用,const指针等传递对象时,允许一个人调用该函数。

由于上述所有原因,作为一般经验法则,如果它不逻辑地修改对象的状态,则应该将函数声明为“const”。如果对象的逻辑状态发生变化,则不要使用“const”。顺便说一下,有些情况下实际状态会发生变化,但逻辑状态却没有(例如缓存),在这种情况下,仍然应该将函数标记为“const”,但是需要在缓存中使用“mutable”关键字变量,以告诉编译器修改它们实际上不会改变逻辑状态。

答案 5 :(得分:0)

直观地说,这意味着该方法不会修改调用它的对象。但实际上,这意味着两件事:

  • 可以在声明为const的对象或对象指针上调用该方法。
  • 在该方法中,this指针变为const。因此,所有成员(声明为mutable的成员除外)都是const,即在方法的上下文中是只读的。但是,它仍然可以修改:
    • 由其调用的对象成员指向的数据
    • 除了通过this指针访问的数据 - 包括全局数据,方法参数指向的数据,类的静态成员,类的其他对象,甚至同一个对象(如果碰巧有访问非const指针或使用const_cast绕过常量。

答案 6 :(得分:-1)

const表示不允许print()修改未标记为mutable的状态变量。