补充:memcpy的实现 && const对象为什么不可以调用非const成员函数,非cosnt可以调用const成员函数

本文讨论了C++中的memcpy和strcpy的区别,强调了memcpy对内存空间重叠的处理,以及const对象和非const对象调用成员函数时的不同。着重讲解了const和非const成员函数的this指针隐式转换规则。
摘要由CSDN通过智能技术生成

最近在看牛客一些小伙伴的面经,发现有些问题还是回答不上来,慢慢积累一下
memcpy和之前的strcpy的实现有点相似,主要strcpy做的是一个字符串拷贝,而memcpy主要做的是一个内存拷贝,这就不仅仅局限于字符串的问题了,同时memcpy还有检查内存空间重叠情况的处理,对于内存空间重叠的拷贝,处理也要比strcpy更加完善

先给出strcpy的写法

char * strcpy(char * dest,const char * src){
       assert((dest != NULL) || (src != NULL));
       char * tem = dest;
       while(*src != '\0'){
           *dest = *src;
           dest++;
           src++;
       }
       *dest = *src;
       return tem;
}

可以看到,一般我们手撕的字符串拷贝的函数是没有类似重叠区间的判断的,(当然可以自己加)

下面写一个内部有重叠区间判断的memcpy

char * memcpy(char * dest,const char * src,int size){
     assert((dest != NULL) || (src != NULL));
     char * tem = dest;
     if(src < dest && src + size -1 >= dest){
           dest = dest + size -1;
           src = src + size -1;
            while(size--){
            	*dest = *src;
               dest--;
               src--;
			}           
     }else{
          while(size--){
             *dest = *src;
             dest++;
             src++;
          }
    }
    return tem;
}

再来说说为什么const对象不能调用非const成员函数

我们知道,const/非const 成员函数是对象实例的一部分,也就是说,非静态的成员函数的第一个参数实际上都是一个隐式的this指针。实际上,是编译器将对象实例的地址转化为了一个this指针

对于非const对象,这个this 指针为 class A * this
那么如果是非const成员函数被调用时,就是: void Func( class A * this) 传入一个 class A * this指针,没有问题

对于const对象,这个this 指针为 const class A * this
那么如果是非const成员函数被调用时,就是:
void Func( class A * this) 传入一个const class A * this,const变量是不能隐式转换为非const类型的,自然会出问题

那么非const对象调用const函数时,发生了什么呢?

对于非const对象,这个this 指针为 class A * this

那么如果是非const成员函数被调用时,就是:
void Func( const class A * const this) 传入一个 class A * this指针,没有问题
const 形参是可以接受非const值的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值