【C++入门】6 类与对象中-const成员

目录

const成员

概念

const修饰函数的条件 

 引入:const在传值传参时的应用

思考下面的几个问题:

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

 


const成员

概念

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

const实质上修饰的是this指针指向的内容,this指针是类的成员函数的一个形参,因此const是无法修饰全局函数的,因为全局函数没有this指针。

const修饰函数的条件 

Const对象可以调用 const也可以调用。

能否加const取决于是“读函数”还是“写函数”

总结:如果是一个对成员变量只进行读访问的函数->建议加const,这样const对象和非const对象都可以使用成员函数。

如果是一个对成员变量只进行写访问的函数-不能加const,否则不能修改成员变量。

 引入:const在传值传参时的应用

Const int i=0;

Int j=i;这里是拷贝,j改变不影响i

Int& r=i;传引用,r的改变影响i

权限放大指针和引用赋值才存在权限放大

Const int*p1=&i

Int* p2=p1;

 临时变量具有常性临时变量常出现的两个场景--类型转换,返回值。

 我们来看看下面的代码

class Date
{
public:
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << "Print()" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
void Print() const
{
cout << "Print()const" << endl;
cout << "year:" << _year << endl;
cout << "month:" << _month << endl;
cout << "day:" << _day << endl << endl;
}
private:
int _year; // 年
int _month; // 月
int _day; // 日
};
void Test()
{
Date d1(2022,1,13);
d1.Print();
const Date d2(2022,1,13);
d2.Print();
}

思考下面的几个问题:

(按照引入的内容中权限的放大与缩小的思想来看这些问题就变得很简单)

1. const对象可以调用非const成员函数吗?不能,权限放大了。

2. const对象可以调用const成员函数吗?可以,权限缩小了。

3. const成员函数内可以调用其它的非const成员函数吗?不能,权限放大了。

4. const成员函数内可以调用其它的const成员函数吗?权限的缩小。

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


这两个默认成员函数一般不用重新定义 ,编译器默认会生成。

class Date
{
public :
Date* operator&()
{
return this ; 
}
const Date* operator&()const
{
return this ;
}
private :
int _year ; // 年
int _month ; // 月
int _day ; // 日
};

 这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需
要重载,比如想让别人获取到指定的内容!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值