请考虑以下代码:
class Test
{
public:
//1
int kon1() const;
//2
const int kon2();
//3
static int kon3();
};
据我所知,功能1和2之间的区别在于:
(如果我的理解有误,请纠正我)
我的问题是: 正如我们在那里看到的那样,如果我们想要使一个函数成为const函数,那么将const关键字放在后面。但是为什么在函数3中,静态函数,静态关键字放在前面?
答案 0 :(得分:3)
对于const
成员函数,之后必须使用const
关键字,以避免返回类型的歧义。
对于static
,virtual
以及其他对该函数如何工作有显着影响的关键字,最好先将其列出,以便在类定义中更容易看到。例如,我们可以快速浏览成员函数列表并查找所有static
函数或所有virtual
函数 - 帮助我们理解函数的整体用法。
标记成员函数const
(或者例如override
)是一个不太重要的区别 - 如果你有一个非const
对象,你可以调用函数,无论它们是{{{ 1}}或者不是,适当的const
- 对于阅读开发者来说通常是显而易见的,因为它们吸收函数返回类型和标识符,并且在一些公司/项目编码标准中,变异函数被分组在const
之上。 -accessors,或同一成员函数的const
和非const
版本并排以强调它们的相似性 - 然后差异const
- ness更突出。
所有这些因素结合在一起使得C ++中的实际选择最适合开发,但你正确地观察到它们有点不一致。
答案 1 :(得分:0)
关键字static
不会修改变量的类型。它修改了它所在的内存地址。它同样用于函数类型变量和数据类型变量:
static int n; // data
static int n (); // function
关键字const
会修改变量的类型。对于函数类型变量,此关键字有两种可能的含义:
将函数的返回值修改为类型const
:
const int n(); //函数只能从非const对象调用,并返回一个const值
修改如何调用此函数
int n()const; //函数可以调用const和非const对象,并返回非const值。
答案 2 :(得分:0)
您混合了两个概念,即存储类型的存储类。
C ++有以下类型的存储类
auto,register,static,extern&可变
以下类型的存储类型(基于您在存储时可以执行的操作)
只读(可以初始化) - >这是const
读写 - >这是非常数。
因此,当你定义一个变量/函数时,你已经预先知道了你想要关联的存储类型。这就是为什么你把静态作为你的代码中的第一个关键字。
希望这有帮助。
答案 3 :(得分:0)
int kon1() const;
此函数是readonly函数,仅用于处理const数据。
const int kon2();
此函数可以在可修改的对象上工作,但它返回的类型是readonly,调用者不能修改它。