类和对象II

目录

this指针

对象数组和对象指针

向函数传递对象

静态成员

静态数据成员

静态成员函数

 友元

友元函数

友元类

共享数据的保护

常引用

常对象

常数据成员

常成员函数


this指针

this指针保存当前对象的地址,称为自引用指针

*this就是当前对象

对象数组和对象指针

用对象指针访问对象数组(把对象数组的地址赋给对象指针,指针用 -> 而不是 . 调用成员函数

Score score[2];
score[0].setScore(90, 99);
score[1].setScore(67, 89);

Score *p;
p = score;   //将对象score的地址赋值给p
p->showScore();
p++;    //对象指针变量加1
p->showSccore();

Score *q;
q =&score[1];   //将第二个数组元素的地址赋值给对象指针变量q

向函数传递对象

使用对象作为函数参数  对象可以作为参数传递给函数,其方法与传递其他类型的数据相同。在向函数传递对象时,是通过“传值调用”的方法传递给函数的。因此,函数中对对象的任何修改均不影响调用该函数的对象(实参本身)。


使用对象指针作为函数参数  对象指针可以作为函数的参数,在函数调用过程中,形参对象指针所指的对象值的改变也同样影响着实参对象的值。


使用对象引用作为函数参数  在实际中,使用对象引用作为函数参数不但具有用对象指针做函数参数的优点,而且用对象引用作函数参数将更简单、更直接。

静态成员

静态数据成员


为实现同一个类的不同对象之间的数据共享:static  ,静态数据成员

定义静态数据成员的格式:static  数据类型 数据成员名
静态数据成员初始化应在类外单独进行,而且应在定义对象之前进行一般在main()函数之前、类声明之后的特殊地带为它提供定义和初始化。

静态数据成员属于类(准确地说,是属于类中对象的集合),而不像普通数据成员那样属于某一对象,因此,可以使用  类名::  访问静态的数据成员。 静态数据成员与静态变量一样,是在编译时创建并初始化。它在该类的任何对象被建立之前就存在。因此,共有的静态数据成员可以在对象定义之前被访问。对象定义后,共有的静态数据成员也可以通过对象进行访问。其访问格式:

对象名.静态数据成员
对象指针->静态数据成员名;

静态成员函数

在类定义中,前面有static说明的成员函数称为静态成员函数。静态成员函数属于整个类,是该类所有对象共享的成员函数,而不属于类中的某个对象。静态成员函数的作用不是为了对象之间的沟通,而是为了处理静态数据成员

调用公有静态成员函数的格式:

类名::静态成员函数名(实参表);

对象.静态成员函数名(实参表);

对象指针->静态成员函数名(实参表);

class Score{
private:
	int mid_exam;
	int fin_exam;
	static int count;     //静态数据成员,用于统计学生人数
	static float sum;     //静态数据成员,用于统计期末累加成绩
	static float ave;     //静态数据成员,用于统计期末平均成绩
public:
	Score(int m, int f);
	~Score();
	static void show_count_sum_ave();   //静态成员函数
};

Score::Score(int m, int f)
{
	mid_exam = m;
	fin_exam = f;
	++count;
	sum += fin_exam;
	ave = sum / count;
}

Score::~Score()
{

}

/*** 静态成员初始化 ***/
int Score::count = 0;
float Score::sum = 0.0;
float Score::ave = 0.0;

void Score::show_count_sum_ave()
{
	cout << "学生人数: " << count << endl;
	cout << "期末累加成绩: " << sum << endl;
	cout << "期末平均成绩: " << ave << endl;
}

int main()
{
	Score sco[3] = {Score(90, 89), Score(78, 99), Score(89, 88)};
	sco[2].show_count_sum_ave();
	Score::show_count_sum_ave();

	return 0;
}

 友元

友元的产生:类的主要特点之一是私有成员只能通过它的成员函数来访问

友元函数

目的:使其他函数可以访问类的成员

什么时候使用友元?

(1)运算符重载的某些场合需要(2)两个类要共享数据的时候

在类中声明友元函数时,需要在其函数名前加上关键字friend

友元函数没有this指针,必须通过作为入口参数传递进来的对象名(或对象指针、对象引用)来访问该对象的数据成员

友元类

可以将一个类声明为另一个类的友元

class Y{
    ···
};
class X{
    friend Y;    //声明类Y为类X的友元类
};

当一个类被说明为另一个类的友元类时,它所有的成员函数都成为另一个类的友元函数,这就意味着作为友元类中的所有成员函数都可以访问另一个类中的所有成员。

共享数据的保护

使用const——既保护数据共享又防止数据被改动

常引用

const 类型& 引用名

常引用所引用的对象不能被更新。如果用常引用做形参,便不会产生对实参的不希望的更改。

常对象

const Date date(2021, 5, 31)

如果在说明对象时用const修饰,则被说明的对象为常对象。常对象中的数据成员为常量且必须要有初值

常数据成员

使用const说明的数据成员称为常数据成员。如果在一个类中说明了常数据成员,那么构造函数就只能通过成员初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值

常成员函数

类型 函数名(参数表) const

常成员函数可以访问常数据成员,也可以访问普通数据成员

常成员函数中不会更新数据成员的值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值