C++知识点1

目录

const

作用

常函数

让常函数修改成员变量的关键字:mutable

在C++中以C语言的方式进行编译

重载和重写

函数重载

函数重写

区别

C++比较器

在堆区创建一个五个对象的数组

初始化参数列表

决定参数初始化顺序的因素

结构体对齐规则

assert如何使用

内存泄漏

出现内存泄漏的情况

如何检测内存泄漏,如何实现一个内存泄漏的程序

const

作用

  • 修饰变量,说明该变量不可以被改变;
  • 修饰指针,分为指向常量的指针 和 自身是常量的指针(常量指针);
  • 修饰引用,指向常量的引用,用于形参类型,即避免了拷贝,又避免了函数对值的修改;
  • 修饰成员函数,说明该成员函数内不能修改成员变量。

常函数

成员函数 后加 const,我们称这个函数为常函数。

让常函数修改成员变量的关键字:mutable

在C++中以C语言的方式进行编译

extern C

重载和重写

函数重载

C++允许在同一个作用域中的某个函数(函数重载)和运算符指定多个定义。

  • 在同一个作用域内可以声明几个功能类似的同名函数。
  • 这些同名函数的形参(类型、个数、顺序)不同。
  • 不能仅以函数的返回类型不同来重载函数。

函数重写

重写是指派生类中存放重新定义的函数。其函数名,参数列表,返回值类型,都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。

重写函数的基类中被重写的函数必须有virtual修饰。

区别

  • 范围:重写和被重写的函数在不同的类中,重载和被重载的函数在同一类中。
  • 参数:重写和被重写的函数参数列表一定相同,重载和被重载的函数参数列表一定不同。
  • virtual:重写的基类函数必须有virtual修饰,重载和被重载函数可以被virtual修饰,也可以没有。

C++比较器

  1. struct重载运算符()
  2. class重载运算符()
  3. 定义函数
  4. lambda表达式
  5. function包装lambda表达式

转载:

c++优先队列priority_queue(自定义比较函数)_c++优先队列自定义比较_菊头蝙蝠的博客-CSDN博客

在堆区创建一个五个对象的数组

class A{
public:
    A(int a){
        
    }
}

int main(){
    A* p = new A[5] {A(1), A(2), A(3), A(4), A(5)};
    
    return 0;
}

初始化参数列表

引用类型和常量类型的成员变量必须使用初始化参数列表。

  • 引用类型:引用必须在定义的时候初始化,并且不能重新赋值
  • 没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化。

更高效:少了一次调用默认构造函数的过程。

决定参数初始化顺序的因素

  • 跟参数列表的初始化顺序无关
  • 取决于声明对象的顺序

结构体对齐规则

  • 保证最长成员对齐
  • 保证整数倍地址对齐
  • 结构体变量的首地址能够被其最宽类型成员的大小所整除。
  • 结构体每个成员相对结构体首地址的偏移量都是成员大小的整数倍。
  • 结构体的总大小为结构体最宽基本类型成员大小的整数倍。
struct s{
    char b;
    short a;
    char c;
    int d;
};
//sizeof(struct s) == 12;

struct ss{
    char b;
    char c;
    short a;
    int d;
};
//sizeof(struct ss) == 8;

assert如何使用

assert宏的原型定义在<assert.h>中,被C/C++用来判断某些条件是否成立。

assert的函数申明如下:

void assert( int expression );
int main(){
    int num = 1;
    assert(num == 1); //true,断言成功

    num = 10;
    assert(num == 1); //false,断言失败

    return 0;
}

内存泄漏

申请了一块内存空间,使用完毕后没有释放掉。

出现内存泄漏的情况

  • new和malloc申请资源使用后,没有用delete和free释放。
  • 子类继承父类时,父类析构函数不是虚函数。
  • 浅拷贝

如何检测内存泄漏,如何实现一个内存泄漏的程序

内存泄漏就是new出来的内存没有通过delete合理的释放掉。new和delete这两个函数就是关键点。可以重载new和delete,每次new中开辟一块内存就用链表把这个内存的信息保存下来,每次用delete删除一块内存就从链表中删除这块内存的记录。(也可以将链表换成哈希表)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值