营销案例网站,手机网页怎么横屏,做网站膜网站怎么做,国家高新技术企业牌子2014年1月19日 内容整理自The Cherno:C系列
2014年1月20日 内容整理自《程序设计教程#xff1a;用C语言编程 第三版》 陈家骏 郑滔
-----------------------------------------------------------------------------------------------------------------------------…2014年1月19日 内容整理自The Cherno:C系列
2014年1月20日 内容整理自《程序设计教程用C语言编程 第三版》 陈家骏 郑滔
---------------------------------------------------------------------------------------------------------------------------------
static关键字在C中有2个意思这取决于上下文
1.在类或者结构体的外部使用static关键字2.在类或者结构体内部使用static关键字
简而言之
1.类或结构体外部的static意味着你声明为static的符号将只能对你定义它的翻译单元可见
2.而类或结构体内部的静态变量static,意味着这个变量将于所有类的实例共享内存这意味着该静态变量在你在类中创建的所有实例中。有时同一个类的不同对象需要共享数据如果使用全局变量来表示共享的数据则缺乏对数据的保护。
---------------------------------------------------------------------------------------------------------------------------------
1.在类或者结构体的外部使用static关键字
现在我们集中研究在类或结构体外部的static变量 //在具有如下两个文件main.cpp和Static.cpp的情况下运行代码没有报错 然而让我们在Static.cpp中删除关键字static,再次运行报错原因是多重定义了全局变量s_Variable
so,我们不可以在同一个项目中有两个同名的全局变量-
尝试1extern关键字 尝试2static关键字
在某个.cpp文件中将变量声明为static可以类比于在类中声明一个private的变量其他的所有翻译单元都不能看到这个s_variable变量the linker will not see this in a global scope
尝试在Static.cpp中定义一个函数试试 仍显示重复定义
尝试将Static.cpp中的function(){}函数标记为static的点击运行就不会报错了 如果你想在头文件中声明一个静态变量并将该头文件包含在两个不同的C文件中这就相当于在两个文件中都声明了相同的静态变量
---------------------------------------------------------------------------------------------------------------------------------
2.在类或者结构体的内部使用static关键字 在C中采用类的静态成员static member来解决同一个类的对象共享数据的问题与普通数据成员不同的是类定义中的静态数据成员对于该类的所有对象只存在一个拷贝当通过一个对象改变了静态数据成员的值时通过同类的其他对象可以看到这个修改。
类的静态成员分为
类的静态数据成员(static data)类的静态成员函数static function
类定义内部声明静态数据成员而静态的数据成员往往需要在类的外部定义并初始化 访问类的静态成员的方式有两种
通过对象访问格式如上述object.Sum()通过类名访问格式如上述A::Share 如果你把static和变量一起使用这意味着在类的所有实例中这个变量都只有一个实例
如果我创建一个名为Entity的类我不断创建Entity的实例我仍然只会得到那个变量的一个版本
意思是如果某个实例改变了这个静态变量----在这个类中的所有实例都会反映这个变化。
so,通过类的实例来引用静态变量是没有意义的。
示例1 在上述代码中将x,y变成静态的 main函数中的初始化就会失败因为x和y不再是类成员
解决方案定义x和y //这里有点乱了下次回来改
书上例题
---------------------------------------------------------------------------------------------------------------------------------
#includeiostream
//P233例题
/*实现对某类的对象的计数* 我们有时需要在程序执行的某个时刻知道创建了多少个某类对象还未消亡* 为了实现这个功能我们可以在类中定义一个静态数据成员每创建一个类的对象就在构造函数中把该静态数据成员的值加1* 每撤销一个该类的对象就在析构函数中把该静态数据成员的值减1* 在程序运行的任何时刻通过该静态数据成员我们就可以知道某时刻该类的对象的个数*/
//note:struct和class的书写格式都是直接花括号
class A{static int Obj_count;
public:A(){Obj_count;}//构造函数、这里我还没有学到A(const A a){Obj_count;}~A(){Obj_count--;}//析构函数//类中还定义了一个静态成员函数用于获得创建的A类对象数目static int Get_Num_Of_Objects(){return Obj_count;}
};//class Aint A::Obj_count0;//static变量被初始化为0int main(){A arr[10];//每一个数组元素都是一个A 类for(int i0;i10;i){A arr[i];}std::coutIts 4:34 ,2024/1/20,the number of class As objects is:A::Get_Num_Of_Objects()std::endl;A object;std::coutIts 4:34 ,2024/1/20,the number of class As objects is:A::Get_Num_Of_Objects()std::endl;}
---------------------------------------------------------------------------------------------------------------------------------
运行结果