
Box∷volume(
)
实际上也允许通过对象名调用静态成员函数,如
a.volume(
)
但这并不意味着此函数是属于对象a的,而只是用a的类型而已。
静态成员函数的作用是为了能处理静态数据成员。
可以说,静态成员函数与非静态成员函数的根本区别是:
非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
在C++程序中,静态成员函数主要用来访问静态数据成员,而不访问非静态成员。假如在一个静态成员函数中有以下语句:
cout<<height<<endl
//若height已声明为static,则引用本类中的静态成员,合法
cout<<width<<endl
//若width是非静态数据成员,不合法
但是,并不是绝对不能引用本类中的非静态成员,只是不能进行默认访问,因为无法知道应该去找哪个对象。如果一定要引用本类的非静态成员,应该加对象名和成员运算符“.”。如
cout<<a.width<<endl
//引用本类对象a中的非静态成员
假设a已定义为Box类对象,且在当前作用域内有效,则此语句合法。
举例:
#include
<iostream>
using
namespace
std
class
Student
//定义Student类
{public:
Student(int
n,int
a,float
s):num(n),age(a),score(s){
}
//定义构造函数
void
total(
)
static
float
average(
)
//声明静态成员函数
private:
int
num
int
age
float
score
static
float
sum
//静态数据成员
static
int
count
//静态数据成员
}
void
Student∷total(
)
//定义非静态成员函数
{sum+=score
//累加总分
count++
//累计已统计的人数
}
float
Student∷average(
)
//定义静态成员函数
{return(sum/count)
}
float
Student∷sum=0
//对静态数据成员初始化
int
Student∷count=0
//对静态数据成员初始化
int
main(
)
{Student
stud[3]={
//定义对象数组并初始化
Student(1001,18,70),
Student(1002,19,78),
Student(1005,20,98)
}
int
n
cout<<〃please
input
the
number
of
students:〃
cin>>n
//输入需要求前面多少名学生的平均成绩
for(int
i=0i<ni++)
//调用3次total函数
stud[i].total(
)
cout<<〃the
average
score
of
〃<<n<<〃
students
is
〃<<Student∷average(
)<<endl
//调用静态成员函数
return
0
}
运行结果为
please
input
the
number
of
students:3↙
the
average
score
of
3
students
is
82.3333
说明:
(1)
在主函数中定义了stud对象数组,为了使程序简练,只定义它含3个元素,分别存放3个学生的数据。程序的作用是先求用户指定的n名学生的总分,然后求平均成绩(n由用户输入)。
(2)
在Student类中定义了两个静态数据成员sum(总分)和count(累计需要统计的学生人数),这是由于这两个数据成员的值是需要进行累加的,它们并不是只属于某一个对象元素,而是由各对象元素共享的,可以看出:
它们的值是在不断变化的,而且无论对哪个对象元素而言,都是相同的,而且始终不释放内存空间。
(3)
total是公有的成员函数,其作用是将一个学生的成绩累加到sum中。公有的成员函数可以引用本对象中的一般数据成员(非静态数据成员),也可以引用类中的静态数据成员。score是非静态数据成员,sum和count是静态数据成员。
(4)
average是静态成员函数,它可以直接引用私有的静态数据成员(不必加类名或对象名),函数返回成绩的平均值。
(5)
在main函数中,引用total函数要加对象名(今用对象数组元素名),引用静态成员函数average函数要用类名或对象名。
C++中,不是常对象也可以调用常成员函数。(1) 常对象
用const修饰的对象叫对象常量,其格式如下:
〈类名〉const 〈对象名〉 或者 const 〈类名〉〈对象名〉
声明为常对象的同时必须被初始化,并从此不能改写对象的数据成员。
例:分析下列错误的地方,说明理由:
#include<iostream.h>
class Point
{ int x, y
public:
Point(int a, int b) { x=ay=b}
Void MovePoint( int a, int b){ x+=ay+=b}
Void print(){ cout<<"x="<<x<<"y="<<y<<endl}
}
void main( )
{const Point point1( 10,10)//常量对象
point1.MovePoint(2,2)//常对象point1的数据不能被更改,所以错误
point1.print( )//print函数的this指针不能指向常对象}
常对象常被用在对象的引用上。所谓常引用是指说明引用时用const修饰。常引用所引用的对象不能被更
新,一般用做形参。其格式:
const 〈类型说明〉&〈引用名〉
例:根据例题5-11的类给出程序的执行结果:
#include<math.h>
int length(const Point &p1, const Point &p2)
{ int l
l=sqrt((p1.x -p2.x)* (p1.x -p2.x)+(p1.y-p2.y)*(p1.y-p2.y))
return l
}
void main( )
{
Point a(1,1),b(4,5)
Cout<<"两点的距离是:"<<length( a, b)<<endl
}
本程序的输出:
两点的距离是:5
(2)常成员函数
用const关键词说明的函数叫常成员函数。其格式如下:
〈类型〉〈函数名〉(〈参数表〉)const
常成员函数的作用和功能:
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数。常对象只能调用类的常成员函数
以及类的静态成员函数。
例:给出下列程序的执行结果:
#include<iostream.h>
class Point
{ int x, y
public:
Point(int a, int b) { x=ay=b}
Void MovePoint( int a, int b){ x+=ay+=b}
Void print()const { cout<<"x="<<x<<"y="<<y<<endl}
}
void main( )
{
Point point1(1,1)
const Point point2( 2,2)//常量对象
point1.print()//普通对象可以调用常成员函数
point2.print( )//常对象调用常成员函数
}
本程序执行结果:
x=1 y=1
x=2 y=2 。
申请加入联合国常任理事国的程序。目前常任理事国有五个:中、美、法、英、俄。日本处心积虑入常是为了谋求政治大国地位,日本现在是经济大国,但由于二战影响,政治地位一直不高,入常是其很好的选择。
常任理事国里,美、俄、中反对,英、法支持,反对派占“质量”上的优势;日本和德国是美国的盟友,甚至有人把日本比作美国在“亚洲的不列颠”。然而,作为摆在亚洲的一粒棋子,美国对日本采取“既用之、又防之”的策略。他不愿意看到一个强大的中国崛起,但同样对日本存有防范之心。对德国,美国更是心存顾忌。2003年,法德联手反对伊战让美国人恼火,德国在欧洲大陆影响力不断扩大是美国不愿意看到的。虽然说美德两国经济联系密切、文化认同度高,德国的民主体系也是美国一手打造的,但是,在“入常”问题上,德国外交官员普遍认为美国不会支持他们。对盟友尚且如此,美国对发展中国家更不会支持。
谁能“入常”?好像是奥巴马一个人说了算。当真这样吗?当然不是。就在奥巴马站在印度议会享受掌声响起来的时候,心里还不明白:白宫正为怎样出来替他的“大嘴”圆场而发愁,白宫发言人只能不情愿地强调联合国的主导作用,来给“大嘴”找个台阶下。奥巴马在印度一言既出,联合国官方马上表态:联合国改革是联合国的内部事务,怎么改是要通过联合国所有成员国集体协商一致后才能进行。这无疑是给奥巴马的“大嘴”掴了一掌。
联合国不是美国用来控制世界的“ *** 作系统”,安理会也不是富人俱乐部,更不是公司董事会。把“入常”当成唐僧肉,你争我夺,或者当成个别国家的外交筹码,严重违背了联合国宪章的宗旨和原则。尤其是非洲这么大的一块大陆,尚没有代表性的情况下,某些国家想在“入常”问题上强行闯关,肯定是行不通的。
也许奥巴马不长记性,否则就是喜欢开空头支票,刚飞到日本就又如法炮制一个“入常”说。不过,这倒是给正为“入常”说而欢欣鼓舞的印度泼了一盆冷水,意识到这张空头支票,看上去很美,而“大国地位”不可能是别人恩赐的。
日本似乎比印度更了解奥巴马的“大嘴”,看着飞来的空头支票倒也没乐得手舞足蹈。日本领导人更明白:对待向来是说一套做一套的美国,只能无奈地抱着这样一种态度:你说说,我听听,千万不能当真……
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)