目录
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;
}
&重载后可以在对对象取地址的同时需要将对象的地址打印出来