赞
踩
目录
将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对象发生了改变。
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容,例如:在对对象取地址的同时需要将对象的地址打印出来
//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;
- }
&重载后可以在对对象取地址的同时需要将对象的地址打印出来
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。