const成员与取地址及const取地址操作符重载

目录

1.const成员

2.取地址及const取地址操作符重载


1.const成员

将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。

 

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void func1()
	{}
	void func2()const
	{}
	//1.const成员函数内不可以调用其他的非const成员函数
	//2.const成员函数内可以调用其他的const成员函数
	void  Print()const
	{
		//fun1()  //编译失败
		func2();
	}
	//3.非const成员函数内可以调用其他的const成员函数
	void Print()
	{
		func2();
	}
	//如果在const成员函数中,一定要修改某个成员变量时
	//在定义该变量的时候,使用mutable关键字修改该成员即可
	void func3()const
	{
		_month += 1;
	}
private:
	int _year;
	mutable int _month;
	int _day;
};
int main()
{
	//普通对象既可以调用普通成员函数,也可以调用const成员函数
	Date d1(2022, 11, 20);
	d1.func1();
	d1.func2();
	//const对象:只能调用const成员函数
    const Date d2(d1);
	//d2.func1();
	d2.func2();
}

思考题: 

1.const对象可以调用非const成员函数吗?

答案:不可以;不允许修改const对象中的内容,但是如果允许该对象调用普通的成员函数,在该成员函数中完全可能会修改const对象中的内容,代码不安全

2.非const对象可以调用const成员函数吗?

答案:可以,非const对象是可读可写对象,既可以修改对象中的内容,也可以不修改。

3.const成员函数内可以调用其它的非const成员函数吗?

答案:不可以,const成员函数内部只能调用const成员函数。

        const成员函数:const本质修改this指针,表明该成员函数内部一定不会修改成员变量,是一个只读的成员函数。this的类型:const Date* const

4.非const成员函数内可以调用其他的const成员函数吗? 

答案:可以,非const成员函数中this的类型:Date* const ,即当前对象可修改也可不修改

5.如果在const成员函数中,一定要修改某个成员变量时,在定义该成员变量的时候,使用mutable关键字修改该成员即可

例如:

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	void func3()const
	{
		_day+= 1;
	}
private:
	int _year;
	int _month;
	mutable int _day;
};
int main()
{
	Date d1(2022, 11, 20);
	d1.func3();
	return 0;
}

可以看出d1对象发生了改变。 

2.取地址及const取地址操作符重载

这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容,例如:在对对象取地址的同时需要将对象的地址打印出来

     //this的类型:const Date* const
    //注意:在参数列表中不能加任何参数,否则编译器会将&当成按位&来处理
    const Date* operator&()const
    {
        cout << this << endl;
        return this;
    }

this的类型:Date* const

Date* operator&()
    {
        cout << this << endl;
        return this;
    }

class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	Date* operator&()
	{
		cout << this << endl;
		return this;
	}
	//this的类型:const Date* const
	//注意:在参数列表中不能加任何参数,否则编译器会将&当成按位&来处理
	const Date* operator&()const
	{
		cout << this << endl;
		return this;
	}

	
private:
	int _year;
	int _month;
	mutable int _day;
};
int main()
{
	Date d1(2022, 11, 20);
	Date* p = &d1;
	const Date d2(d1);
	const Date* p2 = &d2;
	return 0;
}

 &重载后可以在对对象取地址的同时需要将对象的地址打印出来

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值