this 指针与常对象指针

【摘要】定义类对象时,我们可以同时定义多个对象,但是在调用函数时,编译器应该怎么样才能分得清楚它到底要对哪个变量进行操作呢?这时候,编译器通常会隐式地使用this指针来完成编译工作。那么,this指针到底是什么呢?常对象指针又是什么呢?这篇文章我会将学的知识整理下来,详尽地告诉你们。

为什么会出现this指针呢?这是为了解决下面的问题

当一个类中定义了多个对象时,则有n组大小相同的空间以存放n个对象中的数据,但是,不同的对象都调用同一个函数的目标代码
因此,为了区分每个对象,在每一个成员函数中都包含一个特殊的指针,它的值是当前被调用的成员函数所在的对象的起始地址。

      int Box::volume()//我们看到的代码是这样
    {
       return (height*width*length);
    }

C++把它处理为
    int Box::volume(Box *this)//实际上编译器是这样处理的
    { return (this->hight * this->width *this->length);
     }

即在成员函数的形参表列中增加一个this指针,在调用该成员函数时,实际上是用上面的方式调用的
a.volume(&a) 将对象a的地址传给形参this指针,然后按this的指向去引用其他成员

简单来说,this指针会指向你要进行函数调用时需要的对象的地址,而这块地址里面存在的就是你想要的变量的值,这一点和指针是一模一样的,但是你只需要知道,这个工作不需要你来完成,只要交给编译器就好了,这是在内部实现的,我们作为使用者是无法知道的

共用数据的保护(常对象)

A:为什么会出现常对象? Q:为了保护数据的安全性
(1)数据修改问题——> 形参和实参,变量与其引用,数据及其指针等,人们可以在不同的场合通过不同的途径访问同一个数据对象
(2)解决办法——> 既要使数据能在一定的范围内共享,又要保证它在一定范围内不会被修改,这时可以把有关的数据定义为常量
可以在定义对象时增加关键字const,指定对象为常对象,常对象必须要赋初值

 Time const t1(12,23,45);//定义一个常对象t1

(3) 常对象的权限约束——> 在t1的生命周期里,对象t1中的所有数据成员都不能被修改
如果一个对象被声明为常对象,那么他只能调用它的常成员函数,不能调用它的普通成员函数(除了系统自动调用的构造函数和析构函数)
因此,常成员函数是常对象唯一的对外接口

 这里举个错误的例子
     const Time t1(12,23,34);
     t1.get_time();    //非法调用

我们已经知道的是,要想使用常对象,那就必须用常成员函数来调用它,像上述那样进行常对象的调用,是完全不被允许的,但是,如果是常成员函数调用普通的对象,那样是允许的。
这就相当于一个警察可以因为工作需要进入另一个警察或者平民的家里,但是,这个平民却不能随意进入警察的家里,因为警察的权限更大一些。

指向对象的常指针

Time *const ptr1; //const 在指针变量名前面,因此指定ptr1是常指针变量
 ptr1 =&t1;       //ptr1指向对象t1,此后不能改变指向

它的指向不可以改变,但是可以改变它指向的对象的值,这点和常指针具有相同之处
指向常对象的指针

const char * ptr
  由于是常对象,所以它的值不可以被修改,但是指针的指向可以换

  const char c[]="boy";
  const char *p1;
  p1=c;
  char *p2=c;   //不合法,因为指针p2不是一个指向常变量的指针

指向常变量的指针变量或许他的权限更高,所以它可以指向普通变量也可以指向常对象变量

2)指向常变量的指针可以指向常变量,也可以指向普通变量,但是指向普通变量之后,他就不能通过指针变量修改该变量的值
    char c1='a';
    const char *p;
    p=&c1;
    *p='b';  //非法,不能通过p1修改c1的值
    c1='b';  //合法,c1并不是一个常变量,因此可以修改

总结:这两种指针在C++里面都会很频繁的用到,因此,熟练掌握这两个知识点显得很重要,我的建议是作为初学者的话,我们应该多加练习,多去看这几种指针的变形模式,以便以后不管遇到哪种都可以游刃有余

注:本文作者也只是一个初学者,希望看到这里的你们可以留下宝贵的意见,我也很喜欢和人交朋友,有什么都可以互相讨论的,我的QQ号是 1593496558,欢迎志同道合的朋友加我哦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值