(6)C++常函数、静态成员使用方法


常函数


1.形式
回顾类中的函数成员:

class Cstu
{
public:
	void print() 
	{
		cout << "shlimy" << endl;
	}
};

即在函数名后加const(类型限定符、类型修饰符) 就是常函数了

	void print() const  //常函数
	{
		cout << "shilmy" << endl;
	}

2.注意
(1).构造函数和析构函数不可以是常函数
3.特点
(1).可以使用数据成员,但不能修改数据成员;对函数功能有更明确的限定
如:此时就不能修改a

class Cstu
{
public:
	int a = 13;
	void print() const  //常函数
	{

		cout << "a" << endl;
	}
};

(2).常对象只能调用常函数,不能调用普通函数

//续上
//主函数调用
const Cstu stu;  //常对象,或叫只读对象  只能调用常函数
stu.print();

(3).常函数的this指针是const Cstu *

#include<iostream>
using namespace std;
class Cstu
{
public:
	const Cstu* print() const  //常函数  const Cstu*型
	{
		return this;
	}
};
int main()
{
	const Cstu stu;  //常对象,或叫只读对象  只能调用常函数
	const Cstu *p = stu.print();  //this是const Cstu*型
	cout << p << endl;
	system("pause");
	return 0;
}

(4).常函数内部声明的变量允许进行修改 如下:

class Cstu
{
public:
	int a = 13;
	void print() const  //常函数
	{
		int b = 2;  //常函数内定义的可以修改,函外不可修改
		b = a*b;
		cout << b << endl;
	}
};

静态成员使用方法static


静态数据成员
1.形式
静态成员:static int a;
static void westrong(){} 静态数据成员和函数成员的书写方式都是一样的
不能利用构造函数初始化,只能类外初始化(类内声明,类外定义)

class Cstu
{
public:
	static int a;
	Cstu() :a(2)  //静态不能这样初始化
	{
		int a = 12;  //赋值可以
	}
};
//类外初始化
int Cstu::a = 13;

静态数据成员:
a.类外初始化,无static int Cstu::a = 13;
b.静态常量整形数据成员可以直接进行初始化

class Cstu
{
public:
	static  int a;
	//静态(static) 整形(int char) 常量(const)
	static const int b = 10;  //在类中直接进行初始化 
	Cstu()
	{
	}
};

2.调用方式:
(1)通过类名作用域

class Cstu
{
public:
	static int a;
	Cstu()
	{

	}
};
int Cstu::a = 13; //初始化
//主函数调用
	cout << Cstu::a << endl;

(2)通过对象调用
若类中又对a 赋值,则覆盖初始值

//同上的类

//主函数调用
	Cstu stu;//通过对象调用
	cout << stu.a << endl;

静态函数成员
1.注意
(1)属于类的属性,不是对象。即所有对象共有一个
如3.
(2)无this指针
(3)不能调用成员函数,可以调用静态成员
a.如下,int a;只有调用的对象被创立后才会存在,而静态成员,对象存在前就已经存在了。所以不能使用数据成员或调用函数,只能使用静态的

class Cstu
{
public:
 	int a;
	static void print()
	{
		cout << "静态函数成员" << endl;
	}
	Cstu()
	{

	}
};

(4)可以作为一种指挥该类所有对象的作用
像下面所说,静态是连接所有对象通信的工具
2.调用

	Cstu::print(); //通过类名作用域调用
	Cstu stu;
	stu.print();  //通过对象调用

3.静态成员与数据成员及对象之间的联系
静态是类的一个属性,是公有的,每个对象都可以访问,在有对象前就存在了。而且其中一个对象修改静态,在其他对象中也会修改;数据成员是私有的,声明数据成员后,每个对象都单独有一份,在其中一个对象中修改,不会对其他对象的值产生影响。

不使用循环,变量自加1:

#include<iostream>
using namespace std;

class Cstu
{
public:
	static int b;  //声明一个静态b
	Cstu()//能使b自加的构造函数
	{
		b++;  //b是共享的,且每次调用都会自加
	}
};
int Cstu::b = 0;  //初始化b
int main()
{
	Cstu stu[5];//创建对象数组  一共调用5次构造函数,b自加5次
	cout << Cstu::b << endl; //输出b值
	system("pause");
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐鑫本鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值