注册 登录
编程论坛 C++教室

一个关于C++静态成员函数与内联函数的问题

发布于 2010-04-28 13:42, 1964 次点击
小弟才接触c++不久,目前还正在学习c++,书上有如下一段话看了几遍还是不明白,小弟才疏学浅,还望各位高手们指点。
以下是书上原话:
“使用静态数据成员时还应该注意:如果要通过非静态函数来访问静态数据成员,应该使用非内联函数,而且访问静态数据成员的函数,其函数体的定义应该与静态成员的初始化写在同一个源程序文件中。因为静态数据成员再被访问之前必须初始化,而编译器只能保证在调用同一源文件中定义的任何非静态函数之前,初始化类的静态数据成员。一个项目可以由多个源程序文件构成,类的定义和静态数据成员的初始化、成员函数体的定义可以不在同一个源文件中。这种情况下,如果使用非静态的内联成员函数访问静态数据成员,有可能出现意料不到的错误。”

通过非静态函数来访问静态数据成员,一定要用非内联函数么?为什么?很多程序我用内联函数编译和运行结果都没出错啊,能不能举出一个出错的例子?
还有末尾说的“意料不到的错误”,能举出一个错误的例子么?
请各位高手帮忙.
2 回复
#2
最近不在2010-04-28 14:52
他不是说多文件容易出错吗?
1.cpp
int fun()
{
    static int a = 10;
    a++;
    return a;
}   
int main()
{
    //fun();
    cout<<fun()<<endl;
   
    return 0;
}

11.cpp
static int a = 1;
int fun(int a);
12.cpp
extern int a;//这个时候a非11.cpp中的a,要是外部变量的话,去掉11.cpp中的static。因此static有一种用法就是多个文件中都有a,
              //如果此文件中的a加上了static,那么该文件的a,只供该文件使用,别的文件彼a非此a;
 int fun (int a)
{
     return a + 1 ;   
}

如果是类里面,由于静态成员为类的公用变量,在第一次使用时就被初始化,所有的对象使用的是同一static成员,一般要用静态方法(函数)使用静态成员。(静态函数是不是所有对象公用同一个,我不是很清楚,应该跟静态成员类似吧)。

如果是函数前面有staitc修饰,那该函数为静态全局函数,与不加static的区别在于,只能在该文件中使用,用法与上面提到的静态成员类似。

还要注意的一点,就是static的作用域,
mian()
{
    for()
    {
        static int a;
    }
}
这种情况下的话static也为全局变量,只是在for的外面不能使用。

关于内联函数的话就是把函数的定义直接拿到需要使用该函数的地方,如果是普通全局函数并没什么问题,可要是静态函数的话,那么在调用静态函数的地方就要共用同一份内容,感觉会有问题。大概就是这么理解吧,部分问题遇到过,实践过,部分猜测。请识别!
#3
南国利剑2010-04-29 12:35
回复 楼主 rxyknight
你用的是vc6.0吧,在c++中完全没有必要用内联函数,因为编译器根本不会真的去处理inline这个命令,
就是说,编译器是对内联函数的显式声明只是进行了一个伪处理,实际上根本就没有把函数真的内联进去。
因此,一般不会出错。
但是你要是把函数体在函数定义声明时直接给出的话,也就是隐式内联,那么就有可能出现错误。
这种错误,不一定编译不了,更致命的是它能通过编译,但是做的确实不合法的数据引用。
1