我有这样的代码......
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()
也在同一个类中。我只是想知道这背后的原因是什么?
答案 0 :(得分:13)
使用int get_hours() const;
之类的const实例方法,const
意味着int get_hours() const;
的定义不会修改this
。
使用static void fun();
之类的静态方法,const不适用,因为this
不可用。
由于其可见性,您可以从类或实例访问静态方法。更具体地说,您无法从静态方法调用实例方法或访问实例变量(例如x
,hours
),因为没有实例。
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)
这是一个纯粹的语法问题。 const
是cv-qualifier
,当应用于成员函数时,必须放在参数声明之后。您试图将它放在函数名称之前,它只能被解释为限定函数的返回类型。
static
是一个存储类说明符,必须出现在它所适用的声明符之前。
这些规则只是从定义C ++语法的方式开始。
答案 5 :(得分:1)
这是因为如果您将const放在首位,则意味着您正在从函数中返回const内容
答案 6 :(得分:0)
更详细地解释了一个和另一个here。在函数声明之后放置const
会使函数保持不变,这意味着它不能改变包含该函数的对象中的任何内容。