编程语言--C/C++、python

文章目录

  • 编程语言
    • 一、C/C++
      • C 与 C++ 的区别(面向对象的特点)
      • C++ 与 Python的区别
      • 判断struct的字节数
      • static 作用
      • Const 作用
      • extern "C"的作用
      • 多态
        • 如何实现多态?
      • 虚函数
        • 虚函数怎么实现的?
      • 析构函数
        • 虚析构函数的作用
        • virtual函数能不能用在构造函数中?
      • 继承
      • 多线程的同步问题
      • 左值和右值
      • C++的设计模式
      • 动态内存管理
      • 智能指针
      • long long转成string
      • NULL和nullstr的区别
      • new/delete和 malloc/free的区别
      • delete和delete []区别
      • C++虚函数的实现机制
      • C++基类的析构函数为什么建议是虚函数?
      • STL中的 vector 和 list 的区别
      • STL中的 vector 和 map 的底层结构
      • map 和 unorder_map 区别
      • 实现atoi,即将"1234"转化成1234(int类型)
      • 实现atof,即将"1.234"转换成1.234(float类型)
      • 结构体和联合体的区别
      • 引用和指针
      • C++ operator new 和 new operator
      • 怎么理解C++面向对象?跟Python面向对象有什么区别?
      • C++多态特性,父类和子类的区别
      • 虚函数有哪些作用?多态的虚函数(父类和子类)返回值类型可以不一样吗?什么情况下,返回值类型不一样?
      • C++四种强制类型转换有哪些?每种特性是什么?有什么区别?
      • map 实现原理
      • set 实现原理
      • STL中的sort函数实现
      • std::vector描述一下,如何动态扩展,如何shink内存
      • unorder容器与ordered容器的区别
      • 说一下智能指针,shared_ptr与unique_ptr
      • 普通指针如何实现一块内存只能有一个指针指向这种功能
      • C++ RTTI 是什么?
      • C++是如何实现多态的?
      • vector的iterator什么时候失效?
      • 写CmakeLists.txt,写gcc指令
      • 函数局部变量存在哪里?new出来的变量在哪里?
      • 堆区和栈区什么区别?
      • 悬空指针和野指针有什么区别?
      • 什么是内存泄漏?怎么产生的?如何检测?
      • extern关键字的底层机制是怎么实现的?
      • 静态绑定和动态绑定是怎么实现的?
      • 虚函数表跟对象还是跟类绑定?
      • 返回函数中的静态变量的地址会发生什么?
      • 全局static变量和非static的有什么区别?
      • STL 的 map 如何实现的?
      • unordered_map怎么实现的?画一下底层的数据结构
      • sorted_set 怎么实现?
      • .h里面定义函数,会在什么阶段错误?
      • 为什么.h里面一般只放函数声明?为什么这么设计?
      • 内联函数 inline 作用
      • 析构函数 virtual 作用
      • vector.size() 和 vector.capicity() 区别
      • 计算 vector.push_back() 的平均复杂度
      • 怎么设计一个内存池,要考虑哪些方面?
      • lambda 捕获对象的实现
      • 参考资料
    • 二、Python
      • Python中可变和不可变对象是什么意思?
      • tuple、list 和 dict 的区别
      • iterables、generator 和 yield的区别
      • Python 的装饰器
      • Python 的迭代器
        • 使用迭代器遍历和非迭代器遍历区别?
      • Python 的生成器
      • Python 字典采用的是什么数据结构?
      • Python 的 append 和 extend 有什么区别?
      • Python 的浅拷贝和深拷贝
      • Python的内存回收机制
      • 可变对象和不可变对象

编程语言

一、C/C++

C 与 C++ 的区别(面向对象的特点)

  • TODO

C++ 与 Python的区别

  • TODO

判断struct的字节数

一般使用sizeof判断struct所占的字节数,那么计算规则是什么呢?

关键词:

1.变量的起始地址和变量自身的字节数

2.以最大变量字节数进行字节对齐(倍数关系)。

注:这里介绍的原则都是在没有#pragma pack宏的情况下

先举个例子:

struct A
{char a[5];int b;short int c;
}struct A;

在上例中,要计算 sizeof(a) 是多少?

有两个原则:
1)各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数
即当 A中的a占用了5个字节后,b需要占用四个字节,此时如果b直接放在a后,则b的起始地址是5,不是sizeof(int)的整数倍,所以
需要在a后面补充3个空字节,使得b的起始地址为8. 当放完b后,总空间为5+3+4 = 12. 接着放c,此时为 12 + 2 = 14.

2)为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,
所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
这是说A中占用最大空间的类型,就是int型了,占用了4个字节,那么规定A占用的空间必须是4的整数倍。本来计算出来占用的空间为14,
不是4的整数倍,因此需要在最后补充2个字节。最终导致A占用的空间为16个字节。

再举个例子:

struct B
{char *d;short int e;long long f;char c[1];
}b;void test2() {printf("%d\n", sizeof(b));
}

对于此题,需要注意的一点是:windows系统对long long是按照8字节进行对齐的,但是Linux系统对long long则是按照4字节对齐的。

因此:
d占用4字节(因为d是指针)

e占用2字节

f占用8字节,但是其起始地址为为6,不是4的整数倍(对于Linux系统),或不是8的整数倍(对于Windows系统),因此对e之后进行字节补齐,在这里不管对于Linux还是Windows都是补充2个字节,因此 f 的起始地址是8,占用8个字节。

对于c,它占用了1个字节,起始地址是16,也是1的整数倍。

最后,在c之后需要对整个B结构体占用的空间进行补齐,目前占用空间是16+1 = 17个字节。

对于Linux,按4字节补齐(long long 是按4字节补齐的),因此补充了3位空字节,最后占用空间是 17 + 3 = 20字节。

对于Windows系统,是按8字节补齐的,因此就补充了7个字节,最后占用的空间是24字节。

参考资料

  • 【C++】计算struct结构体占用的长度

static 作用

什么是static?

static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。

为什么要引入static?

函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制)。

static的作用

第一个作用是限定作用域(隐藏);第二个作用是保持变量内容持久化;

  • 函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。

举个例子

#include<iostream>using namespace std;int main(){for(int i=0; i<10; ++i){int a = 0;static int b = 0;cout<<"a: "<< a++ <<endl;cout<<"b(static): " << b++ <<endl;}return 0;
}

输出结果:

a: 0
b(static): 0
a: 0
b(static): 1
a: 0
b(static): 2
a: 0
b(static): 3
a: 0
b(static): 4
a: 0
b(static): 5
a: 0
b(static): 6
a: 0
b(static): 7
a: 0
b(static): 8
a: 0
b(static): 9
  • 在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外其他函数访问

  • 在模型内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。

  • 在类中的static成员变量属于整个类所有,对类的所有对象只有一份复制。即类的所有对象访问的static成员变量是同一个,而不是对象专属的。

  • 在类中的static成员函数属于整个类所有,这个函数不接收this指针,因而只能访问类的static成员变量。同类的static成员变量性质一样,类的对象访问的static成员函数是同一个,不是对象专属的。

参考

  • C++中static关键字作用总结
  • C/C++中STATIC用法总结
  • 《程序员面试宝典》

Const 作用

  • TODO

extern "C"的作用

  • TODO

多态

  • TODO
如何实现多态?
  • TODO

虚函数

  • TODO
虚函数怎么实现的?
  • TODO

析构函数

  • TODO
虚析构函数的作用
  • TODO
virtual函数能不能用在构造函数中?
  • TODO

继承

  • TODO

多线程的同步问题

  • TODO

左值和右值

  • TODO

C++的设计模式

  • 工厂模式
  • 策略模式
  • 适配器模式
  • 单例模式
  • 原型模式
  • 模板模式
  • 建造者模式
  • 外观模型
  • 组合模式
  • 代理模式
  • 享元模式
  • 桥接模式
  • 装饰模式
  • 备忘录模式
  • 中介者模式
  • 职责链模式
  • 观察者模式

参考资料

  • C++ 常用设计模式(学习笔记)
  • 设计模式(C++实例)

动态内存管理

  • TODO

智能指针

  • TODO

long long转成string

  • TODO

NULL和nullstr的区别

  • TODO

new/delete和 malloc/free的区别

  • TODO

delete和delete []区别

  • TODO

C++虚函数的实现机制

  • TODO

C++基类的析构函数为什么建议是虚函数?

防止内存泄漏

  • TODO

STL中的 vector 和 list 的区别

  • TODO

STL中的 vector 和 map 的底层结构

  • TODO

map 和 unorder_map 区别

  • TODO

实现atoi,即将"1234"转化成1234(int类型)

  • TODO

实现atof,即将"1.234"转换成1.234(float类型)

  • TODO

结构体和联合体的区别

结构体:把不同类型的数据组合成一个整体-------自定义数据类型,结构体变量所占内存长度是各成员占的内存长度的总和。

联合体:使几个不同类型的变量共占一段内存(相互覆盖),共同体变量所占内存长度是各最长的成员占的内存长度。

Structure 与 Union主要有以下区别:

1.struct和union都是由多个不同的数据类型成员组成, 但在任何同一时刻, union中只存放了一个被选中的成员, 而struct的所有成员都存在。在struct中,各成员都占有自己的内存空间,它们是同时存在的。一个struct变量的总长度等于所有成员长度之和。在Union中,所有成员不能同时占用它的内存空间,它们不能同时存在。Union变量的长度等于最长的成员的长度。

2.对于union的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于struct的不同成员赋值是互不影响的。

3.联合体的各个成员共用内存,并应该同时只能有一个成员得到这块内存的使用权(即对内存的读写),而结构体各个成员各自拥有内存,各自使用互不干涉。所以,某种意义上来说,联合体比结构体节约内存。

举个例子:

typedef struct
{
int i;
int j;
}A;
typedef union
{
int i;
double j;
}U;

sizeof(A)的值是8,sizeof(U)的值也是8(不是12)。

为什么sizeof(U)不是12呢?因为union中各成员共用内存,i和j的内存是同一块。而且整体内存大小以最大内存的成员的划分。即U的内存大小是double的大小,为8了。

sizeof(A)大小为8,因为struct中i和j各自得到了一块内存,每人4个字节,加起来就是8了。
了解了联合体共用内存的概念,也就是明白了为何每次只能对其一个成员赋值了,因为如果对另一个赋值,会覆盖了上一个成员的值。

举个例子:

例如:书包;可以放置书本、笔盒、记事本等物。

联合体,仅能放入一样东西的包(限制),其尺寸,是可放物品中,最大一件的体积。

结构体,是能放入所有物品的包,所以其尺寸,可同时容纳多样物品。

联合体,同时间只能有一个成员在内。或是说,可以用不同型态,去看同一组数据。

结构体,可以包含多个成员在一起,成员都能个别操作。

引用和指针

  • TODO

C++ operator new 和 new operator

  • TODO

怎么理解C++面向对象?跟Python面向对象有什么区别?

  • TODO

C++多态特性,父类和子类的区别

  • TODO

虚函数有哪些作用?多态的虚函数(父类和子类)返回值类型可以不一样吗?什么情况下,返回值类型不一样?

  • TODO

C++四种强制类型转换有哪些?每种特性是什么?有什么区别?

  • TODO

map 实现原理

  • TODO

set 实现原理

  • TODO

STL中的sort函数实现

  • TODO

std::vector描述一下,如何动态扩展,如何shink内存

  • TODO

unorder容器与ordered容器的区别

  • TODO

说一下智能指针,shared_ptr与unique_ptr

  • TODO

普通指针如何实现一块内存只能有一个指针指向这种功能

  • TODO

C++ RTTI 是什么?

  • TODO

C++是如何实现多态的?

  • TODO

vector的iterator什么时候失效?

  • TODO

写CmakeLists.txt,写gcc指令

  • TODO

函数局部变量存在哪里?new出来的变量在哪里?

  • TODO

堆区和栈区什么区别?

  • TODO

悬空指针和野指针有什么区别?

  • TODO

什么是内存泄漏?怎么产生的?如何检测?

  • TODO

extern关键字的底层机制是怎么实现的?

  • TODO

静态绑定和动态绑定是怎么实现的?

  • TODO

虚函数表跟对象还是跟类绑定?

  • TODO

返回函数中的静态变量的地址会发生什么?

  • TODO

全局static变量和非static的有什么区别?

STL 的 map 如何实现的?

  • TODO

unordered_map怎么实现的?画一下底层的数据结构

  • TODO

sorted_set 怎么实现?

  • TODO

    • volatile关键字

.h里面定义函数,会在什么阶段错误?

  • TODO

为什么.h里面一般只放函数声明?为什么这么设计?

  • TODO

内联函数 inline 作用

TODO

析构函数 virtual 作用

  • TODO

static和const区别?

const和define的区别?

struct和class的区别?

sizeof和strlen的区别?

32位,64位系统中,各种常用内置数据类型占用的字节数?

virtual, inline, decltype,volatile,static, const关键字的作用?使用场景?

C++中函数指针的作用?由那些属性唯一决定一个函数指针?

C++中如何唯一确定一个重载函数?重载函数默认初始化方式?

C++多态的实现机制?虚函数表的内部实现机制?

C++中重载,覆盖,隐藏的区别?

深拷贝与浅拷贝的区别?

派生类中构造函数,析构函数调用顺序?

C++类中数据成员初始化顺序?

结构体内存对齐问题?结构体/类大小的计算?

static_cast, dynamic_cast, const_cast, reinpreter_cast的区别?

shared_ptr, unique_ptr, weak_ptr的区别?auto_ptr与shared_ptr的区别?weak_ptr主要是为了解决什么问题的?shared_ptr的内部实现?

new/delete和malloc/free的区别?

strcat,strcpy,strncpy,memset,memcpy的内部实现?

new operator, operator new, placement new的区别?

单例模式?懒汉式?饿汉式?

C++中有哪些容器(序列容器,关联容器)?vetor与list的区别?set与unordered_set的区别?

vector.size() 和 vector.capicity() 区别

  • TODO

计算 vector.push_back() 的平均复杂度

  • TODO

怎么设计一个内存池,要考虑哪些方面?

  • TODO

lambda 捕获对象的实现

  • TODO

参考资料

  • 1世纪入门C++
  • SLAM、定位、建图求职分享
  • 一名渣渣C++程序员的心酸春招/秋招记【篇幅较长,慎入】

二、Python

Python中可变和不可变对象是什么意思?

  • TODO

tuple、list 和 dict 的区别

  • TODO

iterables、generator 和 yield的区别

  • TODO

Python 的装饰器

  • TODO

Python 的迭代器

  • TODO
使用迭代器遍历和非迭代器遍历区别?
  • TODO

Python 的生成器

  • TODO

Python的全局锁

  • TODO

Python 字典采用的是什么数据结构?

答:使用的是key-value匹配的哈希结构

Python 的 append 和 extend 有什么区别?

  • TODO

Python 的浅拷贝和深拷贝

  • TODO

Python的内存回收机制

  • TODO

可变对象和不可变对象

  • TODO

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/606448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive 的 安装与部署

目录 1 安装 MySql2 安装 Hive3 Hive 元数据配置到 MySql4 启动 Hive Hive 官网 1 安装 MySql 为什么需要安装 MySql? 原因在于Hive 默认使用的元数据库为 derby&#xff0c;开启 Hive 之后就会占用元数据库&#xff0c;且不与其他客户端共享数据&#xff0c;如果想多窗口操作…

【Java集合篇】HashMap 是如何扩容的

HashMap 是如何扩容的 ✔️ 为什么需要扩容?✔️ 桶元素重新映射✔️链表重新链接✔️ 取消树化✔️拓展知识仓✔️除了rehash之外&#xff0c;哪些操作也会将树会退化成链表? ✔️ 为什么需要扩容? HashMap在Java等编程语言中被广泛使用&#xff0c;用于存储键值对数据。Ha…

【QML COOK】- 001-添加资源文件

1. 下图为要添加的资源文件 2. 将资源文件放置在工程目录中 我放在【Resources/Images】下&#xff0c;你随意 3. 添加qrc类型文件 文件->New File... 选择 Qt->Qt Resource File 填好文件名。我填“Images”你随意 出现名为“Images.qrc”的qrc类型文件 4. 添加资源文…

Ansible:简单、快速、安全、最强大的 IT 自动化系统 | 开源日报 No.140

ansible/ansible Stars: 59.6k License: GPL-3.0 Ansible 是一个极其简单的 IT 自动化系统&#xff0c;它处理配置管理、应用部署、云提供、临时任务执行、网络自动化和多节点编排。Ansible 使得像零停机滚动更新与负载均衡器一样复杂的更改变得容易。主要功能包括&#xff1…

【MATLAB第89期】基于MATLAB的差分自回归滑动平均模型ARIMA时间序列预测模型含预测未来

【MATLAB第89期】基于MATLAB的差分自回归滑动平均模型ARIMA时间序列预测模型含预测未来 往期文章 【MATLAB第82期】基于MATLAB的季节性差分自回归滑动平均模型SARIMA时间序列预测模型含预测未来 一、模型介绍 1、模型简介 差分自回归移动平均模型&#xff08;Autoregressiv…

【BIAI】Lecture 5 - Auditory system

Lecture 5 - Auditory system 专业术语 auditory system 听觉系统 pinna 耳廓 auditory canal 耳道 tympanic membrane 鼓膜 cochlea 耳蜗 ossicles 听骨 auditory-vestibular nerve 前庭神经 oval window 椭圆窗 attenuation reflex 衰减反射 tensor tympani muscle 鼓膜张肌…

网络安全与IP地址:构建数字世界的前沿堡垒

网络安全是当今数字社会中不可忽视的挑战之一。而IP地址&#xff0c;作为互联网通信的基础协议&#xff0c;既是数字化时代的桥梁&#xff0c;也是网络安全的关键节点。本文将剖析IP地址在网络安全领域的作用&#xff0c;以及如何利用其特性建立有效的网络安全策略。 IP地址&a…

LeetCode119. Pascal‘s Triangle II

文章目录 一、题目二、题解 一、题目 Given an integer rowIndex, return the rowIndexth (0-indexed) row of the Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: rowIndex 3 Ou…

10个linux文件管理命令

1. ls – 列出目录内容 ls可能是每个Linux用户在其终端中键入的第一个命令。它允许您列出您想要的目录的内容&#xff08;默认情况下是当前目录&#xff09;&#xff0c;包括文件和其他嵌套目录。 它有很多选择&#xff0c;所以最好使用 --help 来获得一些帮助。此标志返回所…

卡码网Java基础课 | 6. 数组的倒序与隔位输出

卡码网Java基础课|6. 数组的倒序与隔位输出 数组ArrayList增强for循环6. 数组的倒序与隔位输出 数组 Java中的数组是一种用于存储相同数据类型的元素的数据结构。 相同数据类型的元素指的是数组中的所有元素都必须是相同的数据类型&#xff1b;固定大小&#xff0c;连续存储&…

yum安装及常用操作

yum安装及常用操作 1. 安装yum2. yum常用命令2.1. 基本语法2.2. [option] 常用选项2.3. [command] 常用命令 1. 安装yum 使用wget下载yum的安装包&#xff0c;这里以CentOS 7为例&#xff0c;如果是其他版本的系统&#xff0c;请根据实际情况修改下载链接&#xff0c;如果wget也…

华为三层交换机通 过VLANIF虚拟接口实现跨VLAN通信

S1配置 vlan batch 2 to 3interface Vlanif2ip address 192.168.2.254 255.255.255.0interface Vlanif3ip address 192.168.3.254 255.255.255.0interface GigabitEthernet0/0/2port link-type accessport default vlan 2interface GigabitEthernet0/0/3port link-type access…

DNS重绑定攻击记录(绕过同源策略、绕过IP黑名单、SSRF绕过)

目录 概念 DNS重绑定情景举例认识 DNS绑定机制 DNS重要记录类型 域名解析过程 TTL 请求域名解析

如何进行sql优化?

在日常工作中都避免不了要和各种SQL语句打交道&#xff0c;无论是开发还是后期维护&#xff0c;一条执行效率高的SQL语句都会对系统性能产生巨大影响。那么&#xff0c;如何进行有效的SQL优化呢&#xff1f;下面将为大家深入浅出地讲解SQL优化的各个方面&#xff1a; 1、了解数…

社科院与美国杜兰大学金融管理硕士项目——勇当开路先锋,争做事业闯将

随着金融行业的不断发展&#xff0c;在职金融人员面临着越来越多的机遇和挑战。在这个充满变革的时代&#xff0c;金融人员需要具备开拓进取的精神&#xff0c;勇当开路先锋&#xff0c;争做事业闯将。只有这样&#xff0c;才能在激烈的竞争中立于不败之地&#xff0c;为企业创…

03 详细的Git命令使用大全

常用命令&#xff1a; git init&#xff1a;初始化一个新的Git仓库。git add <文件名>&#xff1a;将文件添加到暂存区&#xff0c;准备进行提交。git commit -m "备注"&#xff1a;提交暂存区的文件到仓库&#xff0c;并添加提交备注。git status&#xff1a;…

算法32:针对算法31货币问题进行扩展,并对从左往右模型进行总结

本算法是在算法31的基础之上进行推理总结的&#xff0c;因此&#xff0c;在看本章之前&#xff0c;必须先去了解算法31&#xff0c;否则会觉得莫名其妙。 算法31的推理过程&#xff1a; 如果 x y1 y2 y3 y4 y5 y6. x1 y2 y3 y4 y5 y6 那么 x y1 x1. 根据以…

使用高版本JDK编译低版本代码

背景 SonarQube运行于Java17&#xff0c;使用Sonar的Maven插件编译时&#xff0c;如果编译使用的JDK版本低于SonarQube使用的Java17&#xff0c;则会提示Java文件不匹配问题。 Error during SonarScanner execution java.lang.UnsupportedClassVersionError: org/sonar/batch/…

Codeforces Round 911 C. Anji‘s Binary Tree

原题&#xff1a; C. Anji’s Binary Tree time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input output standard output Keksic keeps getting left on seen by Anji. Through a mutual friend, he’s figured out that Anji really …

浏览器刷新页面,缓存的处理方式,强制刷新

刷新页面的缓存处理的方式对比 地址栏回车/直接访问 URL保留强缓存&#xff0c;保留协商缓存&#xff0c;走正常请求流程点击浏览器刷新按钮忽略强缓存&#xff0c;保留协商缓存按f5【command r】忽略强缓存&#xff0c;保留协商缓存ctrl f5 【command shift r 】忽略强缓…