C++类中的常数据成员和静态数据成员的区别

刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵。

常数据成员

常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改

适用于类中定义一些初始化之后不希望被修改的变量。

定义方法:

const 类型名 变量名;

(1)类中的常数据成员只能通过构造函数的参数初始化表进行初始化

(2)常数据成员是实例化对象的一部分,可以用this指针访问。

#include<iostream>
using namespace std;
class Happy_birthday
{
	public:
 		Happy_birthday(char * na):name(na){}
		 void Print()
		 {
 			cout<<name<<" Happy Birthday!"<<endl;
 		}
	private:
		const char * name;
};
int main()
{
	Happy_birthday qianshou("赵哲");
	qianshou.Print();
	return 0;
}

运行结果:

静态数据成员

其实常数据成员和静态数据成员完全是两码事,只不过一开始学习的时候容易混淆罢了。通过上面的解释,我们知道常数据成员类似常变量,是一种一经赋值就不可以改变的变量。

它们最大的区别就是静态数据成员是可以被修改的,而且可以被任何一个对象修改,修改后的值,可以被所有的对象共享。

静态数据成员是属于一个类的而不是某一个对象,它是为该类所定义的所有的对象所共有。该类所定义的对象都可以引用该静态成员,并且值都是一样的。

静态数据成员的存储空间不同于普通的数据成员,它不属于类的任何一个对象,是独立于对象存储的,因此也不可以通过对象的this指针来访问

并且,静态数据成员不可以用参数初始化表进行初始化操作,原因很简单,因为初始化表是在定义对象的时候进行的利用了this指针进行操作,所以不可以。

静态数据成员的定义的方式:

static int num;

访问方式:

可以通过类名直接访问:

Test::s_num;

也可以通过对象名访问:

one.s_num;

不过为了区别于其他的成员变量, 一般使用类名进行访问,因为静态数据成员不属于对象,以免使人误解。

#include<iostream>
using namespace std;
class Test
{
	public:
		Test(int n):c_num(n){};//只能用初始化表对常数据成员赋初值 
		void show()
		{
			cout<<"c_num:"<<this->c_num<<endl;
			cout<<"s_num:"<<s_num<<endl;
		}
		void change(int n)
		{
			s_num=n;	
		} 
		static int s_num;
	private:
		const  int c_num;
};
int Test::s_num=100;//在类体为对静态数据成员赋初值 
int main()
{
	Test one(10);
	one.show();
	one.change(10000);//改变静态数据成员的值 
	cout<<"one changeed:"<<one.s_num<<endl;	//使用对象名one间接访问静态数据成员 
	cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员
	Test two(20);
	cout<<"two changeed:"<<two.s_num<<endl; //使用对象名two间接访问静态数据成员 
	two.change(99); 
	cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员 
	return 0;
}

运行结果:

分析:

我们在程序中可以使用类名直接访问静态数据成员变量,就直接说明了它不属于任何一个对象的这个特点。

我们在定义对象two的时候只对c_num进行了赋值,但是我们使用two.s_num进行输出的时候也是可以输出的,这也说明了这个数据成员确实可以被所有的对象进行引用,并且值都是相同的,因为它本身就不属于任何一个对象。

好啦,大家晚安!


转载于:https://www.cnblogs.com/zhezh/p/3773396.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值