自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 普通成员函数调用方法

linux下执行nm,可以func函数最终被编译器生成了_ZN7Myclass6myfuncEi函数,地址为00000000000011d8。成员函数和全局函数一样,有独立的内存地址,这些函数的地址是在编译期间就确定好的,编译器内部实际是将成员函数的调用转化为一种对全局的调用。编译器将向其插入this的形参,用来确定对象所属的某个成员变量在内存中的位置,常规成员变量的存取都通过this形参来进行。可以看到构造函数与成员函数myfunc都被产生了独立的内存地址,Linux内存布局分析。F11快捷键进入函数。

2024-10-30 23:45:36 265

原创 继承下的内存布局

子类存在虚函数,父类不存在虚函数。或者父类、子类均存在虚函数。当访问父类成员时,this指针需要向下调整(4或者8字节)假设存在一个子类Myclass继承Base类。子类的内存布局依然相同。

2024-10-30 23:11:51 294

原创 C++ 数据语义学

通过obj.***这种对象名访问时,在编译期间就可以确定成员变量的偏移值,而采用指针访问,且存在多态动态绑定时,必须运行期间才能计算成员变量的偏移值(无法确定到底new出来的是基类、还是某一个派生类)当类中成员排列不连续,为了访问速度和性能,成员的边界会进行调整,即往成员之间填充一些字节,使得类对象的sizeof值为4或者8的整数倍。在不存在虚基类的情况下,非静态变量的存取是把类的首地址(this)加上要访问的成员变量的偏移,来进行寻址。成员函数与成员变量参数类型的推导遵循“自顶向下,就近原则”

2024-10-29 23:58:10 677

原创 C++虚函数

当一个类具有虚函数时,或者继承自一个有虚函数的父类时,那么在对象构造时,编译器将向构造函数中插入虚函数指针,用来指向这个类的虚函数表。虚函数表中存放指向虚函数的指针。虚函数表保存在最后生成的可执行文件中,在程序执行时载入内存。

2024-10-28 23:00:56 898

原创 类的初始化列表

而普通构造函数中初始化,首先在此之前调用了成员变量的默认构造,然后在构造函数体中再调用一次构造函数生成一个临时对象,最后调用采用拷贝赋值对之前的对象进行赋值,最后释放这个临时对象;本质:初始化列表可以理解为往构造函数中插入代码,在对象创建时,其内存布局中存在的变量也会在此时一起构造,所有,对于那些只能执行一次初始化的成员变量,必须在构造体执行之前明确。一个类在调用自身构造函数之前,首先会调用成员变量的构造函数进行初始化,然后再调用自身构造函数进行初始化,变量在类中声明的顺序,就是其初始化的顺序。

2024-10-25 21:23:58 403

原创 对象语义-程序转化语义

A() {i = 0;备注:根据三五法则,自定义了拷贝构造,就必须也自定义默认构造、析构函数等(具体的,当定义三者其中之一,编译器将不会再生成其他 默认函数,但其实对于POD类型的类,实际无需拷贝构造与析构函数(成员变量分配的栈内存))A a1(a0);// a0是一个已初始化的对象定义一个对象,为对象分配内存调用对象的拷贝构造函数:型如以下代码。

2024-10-25 07:55:54 330

原创 C++合成默认拷贝构造和移动构造函数

如果没有自定义拷贝构造函数,那么在必要时,编译器会合成拷贝构造函数;如果类中数据成员均为POD类型,编译器无需生成拷贝构造函数,直接执行按位拷贝(如果类中含有一个pod类型的类,那么将递归式的按值拷贝)class A {public:int a;A a1;B obj1;反汇编代码:未合成拷贝构造。

2024-10-23 00:14:12 693

原创 C++虚继承

虚继承的引入主要是为了解决C++多继承中的菱形继承的问题。

2024-10-22 22:29:32 254

原创 C++编译器合成默认构造条件

一个类没有构造函数时,编译器并不一定会合成默认构造函数,只有在必要时,编译器才会合成默认构造函数:单纯的类,不会合成构造函数public:int b;反汇编代码:可以看到没有生成构造函数。

2024-10-18 22:39:17 412 1

原创 C++第七章-类-封装

1 内存分区模型 代码区:存放函数体的二进制代码,由操作系统进行管理的**(程序执行前)** 全局区:存放全局变量和静态变量以及常量, 该区域的数据在程序结束后由操作系统释放**.(程序执行前)** 栈区:由编译器自动分配释放, 存放函数的参数值,局部变量等**(程序执行时)** 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收**(程序执行时)** 内存四区意义: 不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程 ​ 栈区: ​ 由编译器自动分配释放, 存放函数的参数值,局

2021-02-08 21:10:11 309

原创 C++第二章-引用,指针与const

1.引用 例:Int &b=a;(&引用声明符) 本质:起别名,绑定初始值对象,引用必须初始化,且只能绑定一次 引用并非对象,只是对象的别名; ## 1.1 引用做函数参数 **作用:**函数传参时,可以利用引用的技术让形参修饰实参 **优点:**可以简化指针修改实参 1.2 引用做函数返回值* 作用:引用是可以作为函数的返回值存在的 注意:不要返回局部变量引用 用法:函数调用作为左值 1.3 引用的本质 引用的本质在c++内部实现是一个指针常量. 2.指针 指针本身是一个对象,无

2021-02-08 19:05:54 199

原创 C++第六章函数1

1.函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的。 语法:返回值类型 函数名 (参数= 默认值){} 注意事项: 如果某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值 如果函数声明有默认值,函数实现的时候就不能有默认参数(否则会引发二义性错误) 2 函数占位参数 C++中函数的形参列表里可以有占位参数,用来做占位,调用函数时必须填补该位置 语法: 返回值类型 函数名 (数据类型){} 3 函数重载 **作用:**函数名可以相同,提高复用性 函数重载满足条件:

2021-02-08 19:00:49 186

原创 c++第二章-变量和基本类型-1

1.转义序列 换行符\n;横向制表符\t;

2021-02-06 20:46:00 214

原创 python-函数

1.函数的结构 定义函数的格式:def 函数名**(形参):**(括号内可为空,即可无形参) 函数后面所有的缩进行构成了函数体 调用函数的格式:函数名(”实参“)

2020-10-20 09:40:59 179

原创 python-继承

1.父类与子类 笔记: 1.1.子类()里必须含有指定父类的名称,必须用方法__init__()接受创建实例所需要的属性信息 1.2.super()是一个特殊的连接父类和子类的函数,从而可以调用父类的方法__init__(),让子类的实例可以包含父类的所有属性 ...

2020-10-19 15:33:11 127

原创 Python-类和实例

笔记:1.self相当与指向实例的一个形参,无需传入实参。而且必须位于第一的位置(必不可少) name与age相当于实例属性的形参,需要外界传入 2.self.name=name的作用相当于获取形参,且通过self.name的方式使得这个形参能被整个类调用 3.“”“”“”文档字符串,类似于注释的作用 4.注意缩进得统一 5.def init(self,name,age)无需引号 6…title()将首字母大写 7.class Dog():注意得要括号和: ...

2020-10-18 10:25:36 275 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除