【问题标题】:Why we need to put const at end of function header but static at first?为什么我们需要将 const 放在函数头的末尾但一开始是静态的?
【发布时间】:2011-08-30 19:47:15
【问题描述】:

我有这样的代码...

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()也属于同一类。我只是想知道这背后的原因是什么?

【问题讨论】:

  • 我知道为什么const 不能走在前面。不知道为什么static最后不能去...

标签: c++


【解决方案1】:

使用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;
};

【讨论】:

  • this 在静态函数中不可用,但我们仍然可以使用对象访问静态乐趣吗?
  • @teacher 静态函数是通过类型(类)而不是实例(对象)访问的。而且因为每个实例都是特定类型的,我们可以访问它的类型和它的所有函数,但它是隐含在语法中的。
  • 这个答案解释了 staticconst 函数之间的区别,但 IMO 它没有回答作者的原始问题,为什么 const 修饰符放在末尾而不是像 @987654334 这样的开头@。 IMO 接受的答案应该是stackoverflow.com/a/7248970/3538313
【解决方案2】:

最后的const表示函数是常量,所以它不会改变对象的状态。

当你把 const 放在最后时,你不能改变对象成员的状态。

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

const放在开头表示返回类型值是一个常量。

【讨论】:

  • 把静态到底是什么意思?
  • @ProgramCpp 表示它不会编译。
【解决方案3】:

当您将 const 放在开头时,您将其应用于返回类型。如果您的返回类型为 void,这无关紧要,但可以说您返回的不是 const 的char*。如果你把 const 放在开头,你会得到 ​​p>

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

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

把它放在最后可以避免这个问题。

【讨论】:

    【解决方案4】:

    这是因为如果您将 const 放在首位,则意味着您正在从函数返回 const 事物 - 即函数是 const 的不同含义

    【讨论】:

    • 为什么我们不能把静态放在最后?有什么想法吗?
    【解决方案5】:

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

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

    这些规则只是从 C++ 语法的定义方式中得出的。

    【讨论】:

      【解决方案6】:

      这是因为如果你把 const 放在第一位,这意味着你正在从函数中返回一个 const 的东西

      【讨论】:

      • 每次调用函数时返回的东西不一定都是相同的值,但是对象的成员只是在执行过程中读取,不会改变。所以一个 const 函数在执行过程中保持成员值 const,并且不返回一个常量值。
      【解决方案7】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 2022-12-06
        • 2012-12-03
        • 2010-11-30
        • 2011-05-02
        • 2011-03-09
        相关资源
        最近更新 更多