C++关于静态成员函数和常成员函数

C++关于静态成员函数和常成员函数,第1张

静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分。如果要在类外调用公用的静态成员函数,要用类名和域运算符“∷”。如

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年,法德联手反对伊战让美国人恼火,德国在欧洲大陆影响力不断扩大是美国不愿意看到的。虽然说美德两国经济联系密切、文化认同度高,德国的民主体系也是美国一手打造的,但是,在“入常”问题上,德国外交官员普遍认为美国不会支持他们。对盟友尚且如此,美国对发展中国家更不会支持。

谁能“入常”?好像是奥巴马一个人说了算。当真这样吗?当然不是。就在奥巴马站在印度议会享受掌声响起来的时候,心里还不明白:白宫正为怎样出来替他的“大嘴”圆场而发愁,白宫发言人只能不情愿地强调联合国的主导作用,来给“大嘴”找个台阶下。奥巴马在印度一言既出,联合国官方马上表态:联合国改革是联合国的内部事务,怎么改是要通过联合国所有成员国集体协商一致后才能进行。这无疑是给奥巴马的“大嘴”掴了一掌。

联合国不是美国用来控制世界的“ *** 作系统”,安理会也不是富人俱乐部,更不是公司董事会。把“入常”当成唐僧肉,你争我夺,或者当成个别国家的外交筹码,严重违背了联合国宪章的宗旨和原则。尤其是非洲这么大的一块大陆,尚没有代表性的情况下,某些国家想在“入常”问题上强行闯关,肯定是行不通的。

也许奥巴马不长记性,否则就是喜欢开空头支票,刚飞到日本就又如法炮制一个“入常”说。不过,这倒是给正为“入常”说而欢欣鼓舞的印度泼了一盆冷水,意识到这张空头支票,看上去很美,而“大国地位”不可能是别人恩赐的。

日本似乎比印度更了解奥巴马的“大嘴”,看着飞来的空头支票倒也没乐得手舞足蹈。日本领导人更明白:对待向来是说一套做一套的美国,只能无奈地抱着这样一种态度:你说说,我听听,千万不能当真……


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/7975564.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-12
下一篇2023-04-12

发表评论

登录后才能评论

评论列表(0条)

    保存