加入函数const的意思是你不能修改参数,只能读取;
函数const的格式是:[返回值] [函数名](参数列表)const{};
在外调用这类函数也分为 const 类名 对象名(参数初值)和 类名 对象名(参数初值)调用区别如下表:
类名前面无const | 类名前面有const | |
---|---|---|
有函数const | 可调用 | 可调用 |
无函数const | 可调用 | 不可调用 |
再者,函数签名是包括const的,所以有无函数const的同名函数是可以同时存在的。如:
class Zyf
{
public:
Zyf(string _name, int _age): name(_name), age(_age){}
string getName() const {return name;}
string getName() {name += " + not const"; return name;}
int getAge() const {return age;}
private:
string name;
int age;
};
//在main函数里这样调用
Zyf z("hanhan1", 12);
cout << z.getName().c_str() << endl;
const Zyf z1("han", 12);
cout << z1.getName().c_str() << endl;
//对象z1,无可厚非是输出有函数const的那一个函数,但是对象z呢?它可以两个函数都调用吗?
//其实在C++语言有个规则,前面无const会优先调用无函数const,而不是调用两个
//比如Zyf *z2 = new Zyf("ss", 12)这一条语句可以拆解为:
Zyf *z2;
void* mem = operator new(sizeof(Zyf));
z2 = static_cast<Zyf*>(mem);
z2->Zyf::Zyf("ss", 12);
//可以看出new语句整个操作是先分配空间,后调用构造函数
//delete z2可以拆解为
Zyf::~Zyf(z2);
operator delete(z2);
//可以看出delete是先调用析构函数,后释放空间
//至于new Zyf[],delete[] ...则是在operator new后面加一个[],多次分配空间;比如
new Zyf[5]//那么就是分配五次Zyf大小的空间, new [] 一定要搭配delete[]这样才可以把空间释放完全。
通过上面的拆解可以看到,可以对operator new以及delete进行重载。
void* operator new(size_t size){
cout << "need to new the memory:" << size << endl;
return malloc(size);
}
void operator delete(void* ptr){
cout << "need to delete the memory:"<< sizeof (ptr) << endl;
free(ptr);
}
void* operator new[](size_t size){
cout << "need to new the memory:" << size << endl;
return malloc(size);
}
void operator delete[](void* ptr){
cout << "need to delete the memory:"<< sizeof (ptr) << endl;
free(ptr);
}
//main里调用
Zyf * z2 = new Zyf(12, 11);
delete z2;
Zyf * z3 = new Zyf[4];
delete [] z3;
Zyf * z4 = new Zyf[4];
delete z4;
//输出
need to new the memory:8
Zyf()
~Zyf()
need to delete the memory:8
need to new the memory:40
Zyf()
Zyf()
Zyf()
Zyf()
~Zyf()
~Zyf()
~Zyf()
~Zyf()
need to delete the memory:8
need to new the memory:40
Zyf()
Zyf()
Zyf()
Zyf()
~Zyf()
need to delete the memory:8
//可以看到如果使用new[], 而不使用delete[],那么内存就会浪费。
//至于为什么new40字节:两个int 八字节,四个就是32,而在内存·管理中会在第一行告诉系统有4个,这里占据4字节,
//在末尾会有结束符,又是四个,所以一共八个。
//比如,你在new后面加一个long类型,语句为
Zyf * z2 = new(4) Zyf(12, 11);
delete z2;
//当然在重载的地方也要加一个参数,size_t是默认参数
void* operator new(size_t size, long dss){
cout << "need to new the memory:" << size << endl;
cout << dss << endl;
return malloc(size);
}
//带有参数的operator delete就不一样,它必须是跟它一样参数的new对应的构造函数抛出异常,
//带有对应参数的delete才会执行(默认参数除外)
//如果 Zyf * z2 = new(4) Zyf(12, 11);抛出异常,那么void operator delete(void*, long)就会执行
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。