【C++】const和static修饰成员的情况

const

1、const修饰成员变量

class Test
{
public:
	Test(int a, int b):
		ma(a),mb(b)//初始化列表
	{
	}
private:
	const int ma;//声明常成员变量
	int mb;
};
int main()
{
	return 0;
}

2、const修饰对象

class Test
{
public:
	Test(int a, int b):
		ma(a),mb(b)//初始化列表
	{
	}
	void Show()
	{
		std::cout << "ma" << ma << std::endl;
		std::cout << "mb" << mb << std::endl;
	}
private:
	int ma;//声明常成员变量
	int mb;
};
int main()
{
	Test test(10,20);
	test.Show();
	return 0;
}

在这里插入图片描述
对象中的成员是不可修改的
3、const修饰常函数
我们将Test test(10,20);改为const Test test(10,20);,此时的const修饰的就是一个常对象,然后常对象调用show函数,我们发现调用失败:
在这里插入图片描述
程序出错的原因:

  • 对于普通的类成员方法来说都是thiscall调用约定,show函数就会有隐藏的参数:void Show(Test* const this)
  • 这个隐藏的参数是系统提供的。所以在调用的时候程序第一步会将test对象的地址传递给this指针:Test* const this = &test;
 Test test(10,20);
	test.Show();

这两步现在就相当于:

const Test test(10,20);
Test const this = &test;

第一句的const修饰的是test,间接访问也就是*this
第二局的const修饰的是this
这样就会有间接访问修改常量的风险
可以改为:

const Test test(10,20);
const Test const this = &test;

在代码中的修改为:在函数的原型后面加const

void Show()const
	{
		std::cout << "ma" << ma << std::endl;
		std::cout << "mb" << mb << std::endl;
	}

这样程序就是正确的:
在这里插入图片描述
const修饰常函数就是修饰函数内部的this指针,也就是将Type* const this转变为const Type* const this
常对象是不能调用普通方法
常对象只能调用常方法

static

1、static修饰变量
普通的成员变量是属于对象
静态成员变量不属于对象所有对象共享
静态的成员变量不依赖对象访问
一定要在类外初始化

class Test
{
public:
	Test( int b):
	mb(b)//初始化列表
	{
	}
private:
	static int ma;//声明常成员变量
	int mb;
};
int Test::ma = 10;//静态成员变量的初始化方式
int main()
{
	Test test1(10);
	Test test2(20);
	Test test3(30);
	test1.ma = 100;
	std::cout << test2.ma << std::endl;
	return 0;
}

类外实现成员方法

class Test
{
public:
	Test(int b, int c);
	void Show();
private:
	static int ma;
	int mb;
	int mc;
};
Test::Test(int b, int c)
:mb(b),mc(c)
{
}
void Test::Show()
{
	std::cout << "ma:" << ma << std::endl;
	std::cout << "mb:" << mb << std::endl;
	std::cout << "mc:" << mc << std::endl;
}
int Test::ma = 10;
int main()
{
	Test test(10,20);
	test.Show();
	return 0;
}

在这里插入图片描述
2、static修饰成员方法
静态的成员方法是_cdecl调用约定,没有this指针
静态的成员方法可以访问静态的成员变量

int gdata = 10;
class Test
{
public:
	Test(int b, int c);
	static void Show();
	{
		std::cout << "ma:" << ma << std::endl;
		std::cout << "gata:" << gata << std::endl;
	}
private:
	static int ma;
	int mb;
	int mc;
};
Test::Test(int b, int c)
:mb(b),mc(c)
{
}
int Test::ma = 10;
int main()
{
	Test test(10,20);
	test.Show();
	return 0;
}

静态的成员方法不能调用普通的成员方法
普通的成员方法可以调用静态的成员方法

int gdata = 10;
class Test
{
public:
	Test(int b, int c);
	static void Show();
	{
		std::cout << "ma:" << ma << std::endl;
		std::cout << "gata:" << gata << std::endl;
	}
	void Print()
	{
		std::cout << "mb:" << mb << std::endl;
		std::cout << "mc:" << mc << std::endl;
		Show();
		//this->Show();//通过对象的方式调用
		//Test::Show();//通过作用域的方式调用
	}
private:
	static int ma;
	int mb;
	int mc;
};
Test::Test(int b, int c)
:mb(b),mc(c)
{
}
int Test::ma = 10;
int main()
{
	Test test(10,20);
	test.Show();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值