为什么含有c 静态成员变量的类不能在main函数中定义

【图文】静态成员_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
上传于|0|0|文档简介
&&静态成员
大小:203.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢深入解析C++编程中的静态成员函数
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了深入解析C++编程中的静态成员函数,是C++入门学习中的基础知识,需要的朋友可以参考下
C++静态成员函数
与数据成员类似,成员函数也可以定义为静态的,在类中声明函数的前面加static就成了静态成员函数。如
static int volume( );
和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。
如果要在类外调用公用的静态成员函数,要用类名和域运算符“::”。如
Box::volume( );
实际上也允许通过对象名调用静态成员函数,如
a.volume( );
但这并不意味着此函数是属于对象a的,而只是用a的类型而已。
与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员。
我们知道,当调用一个对象的成员函数(非静态成员函数)时,系统会把该对象的起始地址赋给成员函数的this指针。而静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有this指针。既然它没有指向某一对象,就无法对一个对象中的非静态成员进行默认访问(即在引用数据成员时不指定对象名)。
可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,而静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
静态成员函数可以直接引用本类中的静态数据成员,因为静态成员同样是属于类的,可以直接引用。在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。
假如在一个静态成员函数中有以下语句:
cout&&height&& //若height已声明为static,则引用本类中的静态成员,合法
cout&&width&& //若width是非静态数据成员,不合法
但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。
如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如
cout&&a.width&& //引用本类对象a中的非静态成员
假设a已定义为Box类对象,且在当前作用域内有效,则此语句合法。
通过下面这个例子可以具体了解有关引用非静态成员的具体方法。
[例] 静态成员函数的应用。
#include &iostream&
class Student
//定义Student类
Student(int n,int a,float s):num(n),age(a),score(s){ }
//定义构造函数
void total( );
static float average( );
//声明静态成员函数
//静态数据成员
//静态数据成员
void Student::total( )
//定义非静态成员函数
//累加总分
//累计已统计的人数
float Student::average( )
//定义静态成员函数
return(sum/count);
float Student::sum=0;
//对静态数据成员初始化
int Student::count=0;
//对静态数据成员初始化
int main( )
Student stud[3]={
//定义对象数组并初始化
Student(),
Student(),
cout&&"please input the number of students:";
//输入需要求前面多少名学生的平均成绩
for(int i=0;i&n;i++)
//调用3次total函数
stud[i].total( );
cout&&"the average score of "&&n&&" students is "&&Student::average( )&&
//调用静态成员函数
运行结果为:
please input the number of students:3↙
the average score of 3 students is 82.3333
关于静态成员函数成员的几点说明:
在主函数中定义了stud对象数组,为了使程序简练,只定义它含3个元素,分别存放3个学生的数据。程序的作用是先求用户指定的n名学生的总分,然后求平均成绩(n由用户输入)。
在Student类中定义了两个静态数据成员sum(总分)和count(累计需要统计的学生人数), 这是由于这两个数据成员的值是需要进行累加的,它们并不是只属于某一个对象元素,而是由各对象元素共享的,可以看出: 它们的值是在不断变化的,而且无论对哪个对象元素而言,都是相同的,而且始终不释放内存空间。
total是公有的成员函数,其作用是将一个学生的成绩累加到sum中。公有的成员函数可以引用本对象中的一般数据成员(非静态数据成员),也可以引用类中的静态数据成员。score是非静态数据成员,sum和count是静态数据成员。
average是静态成员函数,它可以直接引用私有的静态数据成员(不必加类名或对象名), 函数返回成绩的平均值。
在main函数中,引用total函数要加对象名(今用对象数组元素名), 引用静态成员函数average函数要用类名或对象名。
请思考,如果不将average函数定义为静态成员函数行不行?程序能否通过编译?需要作什么修改?为什么要用静态成员函数?请分析其理由。
C++ static静态成员变量和静态成员函数
一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干。但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享。
可以使用全局变量来达到共享数据的目的。例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享。但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败。因此在实际开发中很少使用全局变量。
如果想在同类的多个对象之间实现数据共享,也不要用全局变量,那么可以使用静态成员变量。
static静态成员变量
静态成员变量是一种特殊的成员变量,它以关键字 static 开头。例如:
class Student{
//将num定义为静态成员变量
Student(char *, int, float);
void say();
这段代码声明了一个静态成员变量 num,用来统计学生的人数。
static 成员变量属于类,不属于某个具体的对象,这就意味着,即使创建多个对象,也只为 num 分配一份内存,所有对象使用的都是这份内存中的数据。当某个对象修改了 num,也会影响到其他对象。
static 成员变量必须先初始化才能使用,否则链接错误。例如:
int Student:: //初始化
也可以在初始化时赋初值:
int Student::num = 10; //初始化同时赋值
初始化时可以不加 static,但必须要有数据类型。被 private、protected、public 修饰的 static 成员变量都可以用这种方式初始化。
注意:static 成员变量的内存空间既不是在声明类时分配,也不是在创建对象时分配,而是在初始化时分配。
static 成员变量既可以通过对象来访问,也可以通过类来访问。通过类来访问的形式为:
类名::成员变量;
//通过类来访问
Student::num = 10;
//通过对象来访问
stu.num = 10;
这两种方式是等效的。
注意:static 成员变量与对象无关,不占用对象的内存,而是在所有对象之外开辟内存,即使不创建对象也可以访问。
下面来看一个完整的例子:
#include &iostream&
class Student{
//将num定义为静态成员变量
Student(char *, int, float);
void say();
int Student::num = 0; //初始化静态成员变量
Student::Student(char *name, int age, float score){
this-&name =
this-&age =
this-&score =
void Student::say(){
//在普通成员函数中可以访问静态成员变量
cout&&name&&"的年龄是 "&&age&&",成绩是 "&&score&&"(当前共"&&num&&"名学生)"&&
int main(){
//使用匿名对象
(new Student("小明", 15, 90))-&say();
(new Student("李磊", 16, 80))-&say();
(new Student("张华", 16, 99))-&say();
(new Student("王康", 14, 60))-&say();
运行结果:
小明的年龄是 15,成绩是 90(当前共1名学生)
李磊的年龄是 16,成绩是 80(当前共2名学生)
张华的年龄是 16,成绩是 99(当前共3名学生)
王康的年龄是 14,成绩是 60(当前共4名学生)
本例中将 num 声明为静态成员变量,每次创建对象时,会调用构造函数,将 num 的值加 1。之所以使用匿名对象,是因为每次创建对象后只会使用它的 say 函数,不再进行其他操作。不过请注意,使用匿名对象有内存泄露的风险。
关于静态数据成员的几点说明:
1) 一个类中可以有一个或多个静态成员变量,所有的对象都共享这些静态成员变量,都可以引用它。
2) static 成员变量和普通 static 变量一样,编译时在静态数据区分配内存,到程序结束时才释放。这就意味着,static 成员变量不随对象的创建而分配内存,也不随对象的销毁而释放内存。而普通成员变量在对象创建时分配内存,在对象销毁时释放内存。
3) 静态成员变量必须初始化,而且只能在类体外进行。例如:
int Student::num = 10;
初始化时可以赋初值,也可以不赋值。如果不赋值,那么会被默认初始化,一般是 0。静态数据区的变量都有默认的初始值,而动态数据区(堆区、栈区)的变量默认是垃圾值。
4) 静态成员变量既可以通过对象名访问,也可以通过类名访问,但要遵循 private、protected 和 public 关键字的访问权限限制。当通过对象名访问时,对于不同的对象,访问的是同一份内存。
static静态成员函数
在类中,static 除了声明静态成员变量,还可以声明静态成员函数。普通成员函数可以访问所有成员变量,而静态成员函数只能访问静态成员变量。
我们知道,当调用一个对象的成员函数(非静态成员函数)时,系统会把当前对象的起始地址赋给 this 指针。而静态成员函数并不属于某一对象,它与任何对象都无关,因此静态成员函数没有 this 指针。既然它没有指向某一对象,就无法对该对象中的非静态成员进行访问。
可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有 this 指针,而静态成员函数没有 this 指针。由此决定了静态成员函数不能访问本类中的非静态成员。
静态成员函数可以直接引用本类中的静态数据成员,因为静态成员同样是属于类的,可以直接引用。在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。
如果要在类外调用 public 属性的静态成员函数,要用类名和域解析符“::”。如:
Student::getNum();
当然也可以通过对象名调用静态成员函数,如:
stu.getNum();
下面是一个完整的例子,通过静态成员函数获得学生的平均成绩:
#include &iostream&
class Student{
//学生人数
Student(char *, int, float);
void say();
static float getAverage(); //静态成员函数,用来获得平均成绩
int Student::num = 0;
float Student::total = 0;
Student::Student(char *name, int age, float score){
this-&name =
this-&age =
this-&score =
void Student::say(){
cout&&name&&"的年龄是 "&&age&&",成绩是 "&&score&&"(当前共"&&num&&"名学生)"&&
float Student::getAverage(){
return total /
int main(){
(new Student("小明", 15, 90))-&say();
(new Student("李磊", 16, 80))-&say();
(new Student("张华", 16, 99))-&say();
(new Student("王康", 14, 60))-&say();
cout&&"平均成绩为 "&&Student::getAverage()&&
运行结果:
小明的年龄是 15,成绩是 90(当前共1名学生)
李磊的年龄是 16,成绩是 80(当前共2名学生)
张华的年龄是 16,成绩是 99(当前共3名学生)
王康的年龄是 14,成绩是 60(当前共4名学生)
平均成绩为 82.25
上面的代码中,将 num、total 声明为静态成员变量,将 getAverage 声明为静态成员函数。在 getAverage 函数中,只使用了 total、num 两个静态成员变量。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 7512 人关注过本帖
标题:java中main函数为什么要定义为静态的static
等 级:论坛游民
帖 子:19
专家分:25
结帖率:100%
&&已结贴√
&&问题点数:20&&回复次数:10&&&
java中main函数为什么要定义为静态的static
java中为什么main函数要定义为static,如果不定义为static又怎么设置其他入口?
定义为static是什么机制,是线程调度、底层封装?
说下原理。。。。。。
搜索更多相关主题的帖子:
等 级:版主
威 望:54
帖 子:2508
专家分:6424
static main()是不属于任何类对象, 如果去掉STATIC定义 就必须要创建对象来调用
你的优秀和我的人生无关!!!!
    我要过的,是属于我自己的生活~~~
等 级:论坛游民
帖 子:19
专家分:25
回复 2楼 lampeter123
那是自然,这只是最表面的解释,main()也是一个类的方法,我问得是为什么定义它为static后,程序就从main()开始,我声明main为static,同时又声明其他方法也为statc,,为什么从main开始,求最根本原因、原理
等 级:版主
威 望:54
帖 子:2508
专家分:6424
main()是C语言的主函数,程序就从这里开始, JAVA也一样吧,因为JAVA是从C语言衍生而来的
你的优秀和我的人生无关!!!!
    我要过的,是属于我自己的生活~~~
等 级:论坛游民
帖 子:19
专家分:25
回复 4楼 lampeter123
main()不止是c的主函数吧,你说的好像就是3+4=7是1+1=2衍生过来的一样,我所有的编程语言都有main吧,我所求的是main是函数入口的原理
来 自:湖南
等 级:蜘蛛侠
帖 子:307
专家分:1180
static方法不能调用非static方法,如果main()是非static就无法使用其他static方法; main()是程序最原始的入口;
楼上,楼下的一定要幸福开心哦!
来 自:武汉
等 级:论坛游民
专家分:30
main函数是所在类的一个方法,就比如一个类是A,那么该类的main其实就是A.main(String[] args),如果一个方法不是静态的,则要先实例化该类,比如要这样 A t=new A();
然后才能调用 A.main(), 而main是函数入口。。
来 自:山东
等 级:论坛游民
帖 子:68
专家分:76
static方法不能调用非static方法,把main()方法定义成静态的,就是解决既能直接调用静态方法又能间接调用非静态方法(比如:类名.非静态方法)。
等 级:小飞侠
帖 子:765
专家分:2103
系统寻找main开始执行
等 级:新手上路
回复 楼主 q
应该是底层规定好了程序从main开始
版权所有,并保留所有权利。
Powered by , Processed in 0.068795 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved实现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型 WinSock-NDIS 网络编程 238万源代码下载-
&文件名称: shiyan
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 781 KB
&&上传时间:
&&下载次数: 4
&&提 供 者:
&详细说明: 实现客户机(CLIENT)类。定义字符型静态数据成员ServerName,保存其服务器名称;整型静态数据成员ClientNum,记录已定义的客户数量;定义静态函数ChangeServerName()改变服务器名称。在头文件client.h中定义类,在文件client.cpp中实现,在文件test.cpp 中测试这个类,观察相应的成员变量取值的变化情况。(需要给出main函数代码和运行结果)
完善Body类,将检测胖瘦的标准定义为静态数据成员并设计相应的静态成员函数。(最好给出main函数代码和运行结果)
定义Boat;和Car两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的和。
-Client (CLIENT) class. Static data members of the defined character ServerName, save their server name
integer static data members ClientNum, records have been defined by the number of customers
the defined static ChangeServerName () function to change the server name. Defined class in the header file client.h in file client.cpp test this class in the file test.cpp observed corresponding member variable values &#8203 &#8203 change. (Need to give the main function code and the results) perfecting Body class detect fat, thin, standard definition designed for static data members and static member function. (Preferably main function code and the results is given) defined Boat
and Car two categories, both have a weight attribute definition of the two a friend function totalWeight of () calculation and the two.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&实验五&&......\client.h&&......\Debug&&......\.....\test.obj&&......\.....\vc60.idb&&......\.....\vc60.pdb&&......\.....\实验五.exe&&......\.....\实验五.ilk&&......\.....\实验五.obj&&......\.....\实验五.pch&&......\.....\实验五.pdb&&......\test.cpp&&......\实验五.cpp&&......\实验五.dsp&&......\实验五.dsw&&......\实验五.ncb&&......\实验五.opt&&......\实验五.plg
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 基于非线性动力学、非线性
控制理论、分岔理论等非线性科学的现代分析方法,对倍周期分岔、Hopf 分岔等
&[] - shpory for exam in Russian

我要回帖

更多关于 静态成员函数定义 的文章

 

随机推荐