最近在看牛客一些小伙伴的面经,发现有些问题还是回答不上来,慢慢积累一下
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值的