前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【玩转腾讯云】C++学习笔记-函数const,new,delete

【玩转腾讯云】C++学习笔记-函数const,new,delete

原创
作者头像
买唯送忧
修改2021-05-04 22:18:22
4220
修改2021-05-04 22:18:22
举报
文章被收录于专栏:虚拟技术学习

一、函数const

加入函数const的意思是你不能修改参数,只能读取;

函数const的格式是:[返回值] [函数名](参数列表)const{};

在外调用这类函数也分为 const 类名 对象名(参数初值)和 类名 对象名(参数初值)调用区别如下表:

类名前面无const

类名前面有const

有函数const

可调用

可调用

无函数const

可调用

不可调用

再者,函数签名是包括const的,所以有无函数const的同名函数是可以同时存在的。如:

代码语言:javascript
复制
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;

};
代码语言:javascript
复制
//在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,而不是调用两个

二、new,delete

1、new,delete动作的拆解

代码语言:javascript
复制
//比如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[]这样才可以把空间释放完全。

2、重载new,delete

通过上面的拆解可以看到,可以对operator new以及delete进行重载。

代码语言:javascript
复制
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字节,
//在末尾会有结束符,又是四个,所以一共八个。

3、扩展重载new,delete==》加入参数

代码语言:javascript
复制
//比如,你在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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、函数const
  • 二、new,delete
    • 1、new,delete动作的拆解
      • 2、重载new,delete
        • 3、扩展重载new,delete==》加入参数
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档