C++中一个文件的static变量可否被其他文件引用,该怎么处理
C++中一个文件的static变量可否被其他文件引用
现在有文件a.h和a.cpp,a.h中定义了class cls,cls中有一静态变量static bool flag;(公有变量)
另有文件b.h和b.cpp, b.h中包含了a.h;
现在我想在b.cpp中使用flag变量,请问可以吗,可以的话应该在b.h/b.cpp中如何声明
希望各位不吝赐教
------解决方案--------------------
1、那为什么我上面说的声明成const并在声明是初始化时就没报错呢?
答:这个原因并不因为定义为static和const的原因,而是因为定义的类型是int(简单类型)如果是自定义的类型,这样初始化是不允许的。C++编译器允许在定义为static const对简单类型的变量进行初始化。
2、 l 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,(申明,此中语句不是我原创,转载)
答:这两句话有矛盾,既然默认初始化为0,那又为什么必须在声明它的文件范围内进行初始化才能使用呢,其实,对于静态变量必须初始化,要不然肯定不能使用。
3、静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
答:这个问题,我不赞同,因为如果该类没有子类,则这句话是正确的,因为确实如此。但如果该类有子类,则这种情况就不成立了,因为你可以在子类中访问该静态变量。前提是该静态变量是public和protected
4、在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )//求至今(本次调用)为止最大值
{
static int biggest; //该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期
if( curr > biggest )
biggest = curr;
return biggest;
}
答:这个我赞同
5、 在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。
答:这个我赞同
------解决方案--------------------
例如:
//a.h
#ifndef _A_H
#define _A_H
#include <iostream>
using namespace std;
static int pp=5; //(b)
class cls
{
public:
static int flag;
void print() const;
};
#endif //_A_H
//--end of a.h
----
//a.cpp
#include "a.h "
int cls::flag=100;
//static int pp=2; //(a)
//pp=2;//(b-1) error C2501: 'pp ' : missing storage-class or type specifiers
//(b-1) error C2374: 'pp ' : redefinition; multiple initialization
void cls::print() const
{
pp=2;//(b-2)
cout < < "in print(),cls::flag= " < <flag < <endl;
cout < < "in a.cpp, use cls::print() to output pp= " < <pp < <endl;//(b)
}
// end of a.cpp
-------
//test.cpp
#include "a.h "
void fun_a()
{
static int x=0;
int y=0;
x++;
y++;
cout < < "x= " < <x < <endl;
cout < < "y= " < <y < <endl;
}
//extern int pp; //(a) test1.obj : error LNK2001: unresolved external symbol "int pp " (?pp@@3HA)
// Debug/test1.exe :fatal error LNK1120: 1 unresolved externals
void main()
{
cls t;
fun_a();
t.print();
cout < < "cls::flag= " < <cls::flag < <endl;
fun_a();
// pp=7; (c)
cout < < "in main(), pp= " < <pp < <endl;
}
//end of test.cpp
输出结果为:
x=1
y=1
in print(),cls::flag=100
in a.cpp, use cls::print() to output pp=2
cls::flag=100
x=2
y=1
in main(), pp=5
现在有文件a.h和a.cpp,a.h中定义了class cls,cls中有一静态变量static bool flag;(公有变量)
另有文件b.h和b.cpp, b.h中包含了a.h;
现在我想在b.cpp中使用flag变量,请问可以吗,可以的话应该在b.h/b.cpp中如何声明
希望各位不吝赐教
------解决方案--------------------
1、那为什么我上面说的声明成const并在声明是初始化时就没报错呢?
答:这个原因并不因为定义为static和const的原因,而是因为定义的类型是int(简单类型)如果是自定义的类型,这样初始化是不允许的。C++编译器允许在定义为static const对简单类型的变量进行初始化。
2、 l 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可改变其值。
类的静态成员变量必须在声明它的文件范围内进行初始化才能使用,private类型的也不例外。如,(申明,此中语句不是我原创,转载)
答:这两句话有矛盾,既然默认初始化为0,那又为什么必须在声明它的文件范围内进行初始化才能使用呢,其实,对于静态变量必须初始化,要不然肯定不能使用。
3、静态变量或静态函数,即只有本文件内的代码才可访问它,它的名字(变量名或函数名)在其它文件中不可见。
答:这个问题,我不赞同,因为如果该类没有子类,则这句话是正确的,因为确实如此。但如果该类有子类,则这种情况就不成立了,因为你可以在子类中访问该静态变量。前提是该静态变量是public和protected
4、在函数体内生成的静态变量它的值也只能维持
int max_so_far( int curr )//求至今(本次调用)为止最大值
{
static int biggest; //该变量保持着每次调用时的最新值,它的有效期等于整个程序的有效期
if( curr > biggest )
biggest = curr;
return biggest;
}
答:这个我赞同
5、 在C++类的成员变量被声明为static(称为静态成员变量),意味着它为该类的所有实例所共享,也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见;而类的静态成员函数也只能访问静态成员(变量或函数)。
答:这个我赞同
------解决方案--------------------
例如:
//a.h
#ifndef _A_H
#define _A_H
#include <iostream>
using namespace std;
static int pp=5; //(b)
class cls
{
public:
static int flag;
void print() const;
};
#endif //_A_H
//--end of a.h
----
//a.cpp
#include "a.h "
int cls::flag=100;
//static int pp=2; //(a)
//pp=2;//(b-1) error C2501: 'pp ' : missing storage-class or type specifiers
//(b-1) error C2374: 'pp ' : redefinition; multiple initialization
void cls::print() const
{
pp=2;//(b-2)
cout < < "in print(),cls::flag= " < <flag < <endl;
cout < < "in a.cpp, use cls::print() to output pp= " < <pp < <endl;//(b)
}
// end of a.cpp
-------
//test.cpp
#include "a.h "
void fun_a()
{
static int x=0;
int y=0;
x++;
y++;
cout < < "x= " < <x < <endl;
cout < < "y= " < <y < <endl;
}
//extern int pp; //(a) test1.obj : error LNK2001: unresolved external symbol "int pp " (?pp@@3HA)
// Debug/test1.exe :fatal error LNK1120: 1 unresolved externals
void main()
{
cls t;
fun_a();
t.print();
cout < < "cls::flag= " < <cls::flag < <endl;
fun_a();
// pp=7; (c)
cout < < "in main(), pp= " < <pp < <endl;
}
//end of test.cpp
输出结果为:
x=1
y=1
in print(),cls::flag=100
in a.cpp, use cls::print() to output pp=2
cls::flag=100
x=2
y=1
in main(), pp=5