为什么我们需要将const放在函数头的末尾但是首先是静态的?

时间:2011-08-30 19:47:15

标签: c++

我有这样的代码......

class Time
{
    public: 
        Time(int, int, int);
        void set_hours(int);
        void set_minutes(int);
        void set_seconds(int);

        int get_hours() const;
        int get_minutes() const;
        int get_seconds() const;

        static void fun() ;

        void printu() const;
        void prints();

    private:
        int x;
        int hours;
        int minutes;
        int seconds;
        const int i;
};

为什么我需要最后放const来使函数成为常量类型,但如果我需要创建一个函数,我可以这样做......

static void Time::fun() 
{
    cout<<"hello";
}

上面的函数fun()也在同一个类中。我只是想知道这背后的原因是什么?

7 个答案:

答案 0 :(得分:13)

使用int get_hours() const;之类的const实例方法,const意味着int get_hours() const;的定义不会修改this

使用static void fun();之类的静态方法,const不适用,因为this不可用。

由于其可见性,您可以从类或实例访问静态方法。更具体地说,您无法从静态方法调用实例方法或访问实例变量(例如xhours),因为没有实例。

class t_classname {
public:
  static void S() { this->x = 1; } // << error. this is not available in static method
  void s() { this->x = 1; } // << ok
  void t() const { this->x = 1; } // << error. cannot change state in const method
  static void U() { t_classname a; a.x = 1; } // << ok to create an instance and use it in a static method
  void v() const { S(); U(); } // << ok. static method is visible to this and does not mutate this.

private:
  int a;
};

答案 1 :(得分:11)

const 在结尾意味着函数是常量,因此它不会改变对象的状态。

当您将 const 放在最后时,您无法更改对象成员的状态。

声明一个函数 static 意味着它根本不属于该对象,它属于类类型。

const 放在开头意味着返回类型值是常量。

答案 2 :(得分:4)

当你将const放在开头时,你将它应用于返回类型。如果你是返回类型,如果无效,这没关系,但是假设你要返回的不是const的char*。如果你把const放在开头,你最终会得到

static const char* MyFunction() { ... }

这告诉我返回类型是const char*,而不是返回char*的const函数。

将它放在最后避免了这个问题。

答案 3 :(得分:2)

这是因为如果你把const放在第一位就意味着你从函数中返回一个const的东西 - 即函数的另一个含义const

答案 4 :(得分:1)

这是一个纯粹的语法问题。 constcv-qualifier,当应用于成员函数时,必须放在参数声明之后。您试图将它放在函数名称之前,它只能被解释为限定函数的返回类型。

另一方面,

static是一个存储类说明符,必须出现在它所适用的声明符之前。

这些规则只是从定义C ++语法的方式开始。

答案 5 :(得分:1)

这是因为如果您将const放在首位,则意味着您正在从函数中返回const内容

答案 6 :(得分:0)

更详细地解释了一个和另一个here。在函数声明之后放置const会使函数保持不变,这意味着它不能改变包含该函数的对象中的任何内容。