C++知识

C++内存分区

栈区:由编译器自动分配释放,存放函数的参数值,局部变量、返回地址等

堆区:动态申请的内存空间,由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

代码区:存放代码,不允许修改,但可以执行。编译后的二进制文件存放在这里

全局区:存放全局变量和静态变量以及常量,程序运行结束操作系统自动释放

Static关键词

全局静态变量:位于静态存储区,程序运行期间一直存在,对外部不可见。
局部静态变量:位于静态存储区,在局部作用域可以访问,离开局部作用域之后static变量仍存在,但无法访问。
静态函数:即在函数定义前加static,函数默认情况下为extern,即可导出的。加了static就不能为外部类访问。
注意不要在头文件声明static函数,因为static只对本文件有效。
类的静态成员:可以实现多个不同的类实例之间的数据共享,且不破坏隐藏规则,不需要类名就可以访问。类的静态存储变量是可以修改的。可以通过<对象名>:<静态成员>进行访问。
类的静态函数:不能调用非静态成员,只可以通过对象名调用<对象名><静态成员函数>
static 不需要初始化,默认为0值。

C++中的四种强制类型转换

静态转换(static_cast):静态转换是最常用的一种类型转换,它可以在不同但相关的类型之间进行转换,如基本数据类型之间的转换、父类指针向子类指针的转换等。但是需要注意的是,静态转换没有运行时类型检查,因此在进行转换时需要确保类型之间是相关的,否则可能会导致错误。

动态转换(dynamic_cast):安全的向下进行类型转换。只能用于含有虚函数的类,只能转指针或引用

常量转换(const_cast):常量转换主要用于去除指针或引用类型的常量属性。它可以将const修饰的对象转换为非const修饰的对象,从而可以修改原本被限制为只读的对象。

重新解释转换(reinterpret_cast):重新解释转换是一种较为底层的转换方式,它可以将一个指针或引用类型转换为另一个不相关的指针或引用类型。这种转换方式非常危险,因为它不会进行任何类型检查,可能会导致未定义的行为。

指针和引用的区别

  1. 指针有自己的内存地址,占四个字节(32位系统),而引用只是一个别名,没有专门的内存地址。
  2. 指针可以被初始化为指向nullptr,而引用必须指向一个已有的对象。
  3. 指针可以改变指向,指向另外的变量。引用一旦初始化后,就不能改变引用的目标
  4. 指针需要解引用(*)来访问目标变量的值,而直接修改引用会改变原对象。
  5. 指针可以多级,而引用最多一级。
  6. 如果返回动态内存分配对象,必须用指针,否则可能引起内存泄漏

 int *p[n]和int(*p)[n]以及int *p()和int(*p)()的区别

int *p[n]:

含义p 是一个指针数组(array of pointers),其中包含 n 个指向 int 类型的指针。

结构:这是一个大小为 n 的数组,每个元素都是一个 int*(指向 int 的指针)。

int *p[5]; // 声明了一个有 5 个元素的数组,每个元素都是指向 int 的指针

int a = 10, b = 20, c = 30;
p[0] = &a; // p[0] 是指向 int 的指针,可以指向 a
p[1] = &b; // p[1] 是指向 int 的指针,可以指向 b
p[2] = &c; // p[2] 是指向 int 的指针,可以指向 c

std::cout << *p[0] << std::endl; // 输出 10
std::cout << *p[1] << std::endl; // 输出 20
std::cout << *p[2] << std::endl; // 输出 30
int (*p)[n]:

含义p 是一个指向数组的指针(pointer to an array),该数组的类型是 int[n],即大小为 nint 数组。

结构:这是一个指针,它指向一个包含 nint 元素的数组。

int arr[5] = {1, 2, 3, 4, 5};  // 一个包含 5 个 int 元素的数组
int (*p)[5] = &arr;            // p 是一个指向 int[5] 的指针,指向数组 arr

std::cout << (*p)[0] << std::endl; // 输出 1
std::cout << (*p)[1] << std::endl; // 输出 2
std::cout << (*p)[2] << std::endl; // 输出 3
int *p():

含义p 是一个返回类型为 int* 的函数,接受任意数量的参数(非标准用法,一般用于说明函数返回类型)。

结构:它声明了一个函数 p,该函数返回一个指向 int 的指针。

int* p() {
    int* x = new int(5);
    return x; // 返回一个指向 int 的指针
}
int (*p)():

含义p 是一个指向函数的指针(pointer to a function),该函数返回 int 类型且不接受任何参数。

结构:它声明了一个指针 p,该指针指向一个返回类型为 int 的函数,该函数不接受任何参数。

int func() {
    return 42; // 返回一个整数
}

int main() {
    int (*p)() = func; // p 是指向函数 func 的指针

    std::cout << p() << std::endl;  // 输出 42
    std::cout << (*p)() << std::endl; // 也输出 42,*p 和 p 等价
}

智能指针

C++的智能指针均位于<memory>库内,有四种:shared_ptr、unique_ptr、weak_ptr、auto_ptr。

智能指针是一种利用对象的生命周期来管理资源的技术。如果我们采用传统的new/delete来申请和释放资源,如果忘记调用delete,或者在调用delete之前程序抛出异常,都会导致内存泄漏问题,采用智能指针对资源进行管理,能够杜绝这类问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值