C++概念知识整理

💡 面向就业的C++概念知识整理

C++概念知识

内存存储机制

根据数据类型的不同,C++会将数据会存储在内存的不同位置。请分别介绍内存位置及其对应数据类型。

答案
    • 存放程序所申请的内存,如malloc和new申请的内存
    • 生命周期取决于程序员的申请和释放,free和delete
    • 存放函数参数,函数中的局部变量和临时变量。
    • 生命周期从函数调用开始到函数调用结束。因此都是用栈来存储,后进先出,用完就丢。
    • 爆栈的说法,其实也就是函数调用的次数太深。
  • 全局/静态存储区
    • 用来存放全局变量、静态变量和常量
    • 生命周期从程序开始到程序结束
  • 常量字符串存储区
    • 常量字符串和其他文字常量
    • 属于只读类型
  • 代码区
    • 程序运行的机器码
    • 属于只读类型

malloc和new的区别

答案
  • 来源与用途
    • malloc: 来自C语言的标准库。用于分配指定大小的连续内存块。
    • new: 是C++中的运算符。除了分配内存外,还会调用对象的构造函数。
  • 返回类型
    • malloc: 返回void*,这意味着返回的指针需要强制转换为适当的类型。
    • new: 返回分配的数据类型的正确指针,不需要任何类型转换。
  • 错误处理
    • malloc: 如果分配失败,返回NULL
    • new: 如果分配失败,会抛出std::bad_alloc异常(除非使用new(std::nothrow),这种情况下如果分配失败会返回NULL)。
  • 初始化
    • malloc: 仅仅分配内存,不初始化。也有对应的calloc函数,可以初始化分配的内存为零。
    • new: 对于非内建类型,会调用相应的构造函数进行初始化。
  • 大小参数
    • malloc: 需要提供要分配的字节大小,例如malloc(5 * sizeof(int))
    • new: 根据数据类型自动确定大小,例如new int[5]
  • 配对的释放操作
    • malloc: 使用free来释放内存。
    • new: 使用deletedelete[]来释放内存。
  • 灵活性与重载
    • malloc: 不能被重载。
    • new: 在C++中可以被重载,为用户提供更多的灵活性。

构造函数和析构函数

智能指针

类的特殊成员函数

C++11如何保证代码只运行了一次

答案

都是使用预处理指令,不过有两种方法:

1.依赖于不冲突的宏名称

1
2
3
4
5
6
7
8
9
10
// 假设这是个test.h的文件,即头文件

// 在文件开始
#ifndef _TEST_H_
#define _TEST_H_

... // 头文件中的实际内容

#endif
// 在文件最后

2.依赖于编译器:

1
2
3
// 在头文件中使用

#pragma once

四种C++11引入的cast方式

答案
  • const_cast:设置或者移除对象的const
  • reinterpret_cast:可以做任意转换,不进行检查
  • static_cast:类似原有的括号转换,可以upcast或downcast,不进行检查
  • dynamic_cast:可以upcast或downcast,会进行检查,对性能有损耗

struct和class的区别

答案

new的操作符重载

std::memset

继承与多态

类中的this

静态变量和常量

inline和extern

c++初始化顺序

c++新特性

虚函数和纯虚函数

cmake

GDB