2016-03-05 144 views
-4

我在介绍C++的oop,我有一个问题。 当我在头文件中声明一个静态函数时,为什么如果我在代码文件中也放入了静态函数,我会得到一个错误?我的意思是,为什么静态应该只在头文件?错误,因为“静态”在C代码

的menssage错误:

mod.cc:71:40:错误:不能声明成员函数 '静态INT MOD :: mida_maxima()' 为有静态链接[-fpermissive]

+1

请张贴你想要做的一个例子。 –

+0

标题:静态布尔函数(); 代码:静态布尔函数(){//代码//} 如果我在代码文件中声明该函数为静态,则会出现错误,我的问题是原因。 – KooPad

+1

请发表[mcve]。是的,请包括MCVE的完整错误信息。 –

回答

1

staticclass里面的成员函数是一个类函数;它在没有任何接收器的情况下工作,所以this不能在里面使用。但是,任何编制单位都可以看到它的声明。

当您定义static函数时,它具有static链接,因此只能从其编译单元中看到(有点像C的static关键字)。显然,一个类函数通常应该在整个程序中可见(而不仅仅是一个编译单元)。

因此,static成员函数的定义应该static,换句话说:

// perhaps in a header file 
class Foo { 
    static void memberfun (int); // class member function declaration 
}; 

// definition in the compilation unit 
void // static is forbidden here 
Foo::memberfun(int arg) { 
    /// some body 
} 

换言之,C++重用static关键字为两个不相关的用途:定义类别成员和声明静态链接(由C启发)。

+0

完美!非常感谢! – KooPad

+0

我认为这个答案并没有真正解决为什么在函数的定义中禁止static的问题。据我所知,语言可以允许在那里使用'static',因为从这个声明可以知道'memberfun'是'static',所以它没有任何区别。我怀疑背后的历史原因,但我不知道。 –

+0

不,'static'也具有受C启发的可见性角色。另外,它用于定义类成员(不是实例成员) –