
C++
文章平均质量分 89
吃数据的猴子
程序人生
展开
-
C++面向对象的内存布局(一)
文章目录类C++中可以使用struct、class来定义一个类变量名规范参考类实例化成为了对象,对象的内存空间由成员变量决定对象对象的内存布局代码段(代码区)数据段(全局区)栈空间堆空间thisthis指针必须用->,不能用. (点左边只能是对象),可省略语法上默认用了this类C++中可以使用struct、class来定义一个类struct和class的区别struct的默认成员权限是publicclass的默认成员权限是private实际开发中,用class表示类比较多变量名规范参考原创 2021-07-23 14:24:59 · 395 阅读 · 0 评论 -
C++静态成员
静态成员:被static修饰的成员变量\函数可以通过对象(对象.静态成员)、对象指针(对象指针->静态成员)、类访问(类名::静态成员)静态成员变量存储在数据段(全局区,类似于全局变量),整个程序运行过程中只有一份内存对比全局变量,它可以设定访问权限(public、protected、private),达到局部共享的目的必须初始化,必须在类外面初始化,初始化时不能带static,如果类的声明(.h文件)和实现分离(在实现.cpp中初始化)就算没有创建对象,静态变量依然存在,因为已经初始原创 2021-07-23 14:24:28 · 705 阅读 · 0 评论 -
C++使用模板的本质
模板泛型,是一种将类型参数化以达到代码复用的技术,C++中使用模板来实现泛型template <typename\class T>typename和class是等价的模板没有被使用时,是不会被实例化出来的模板的声明和实现如果分离到.h和.cpp中,会导致链接错误一般将模板的声明和实现统一放到一个.hpp文件中为什么要使用模板#include <iostream>using namespace std;template <typename T>T原创 2021-07-23 14:16:25 · 233 阅读 · 0 评论 -
二级指针做函数参数
下面围绕对指针数组的操作进行说明第一种内存模型#include "stdio.h"#include <stdlib.h>#include <string.h>void printArr(char** arr,int num) { if (arr == NULL)return -1; for (int i = 0; i < num; i++) { printf("%s\n", arr[i]); }}int sortArr(char** arr, int.原创 2020-08-11 22:27:45 · 2370 阅读 · 1 评论 -
C++面向对象多态之虚析构函数和纯虚函数
虚析构函数如果存在父类指针指向子类对象的情况,应该将析构函数声明为虚函数(虚析构函数)delete父类指针(如下面代码的cat指针)时,才会调用子类的析构函数,保证析构的完整性#include <iostream>using namespace std;struct Animal { virtual void speak() { cout << "Animal::speak()" << endl; } virtual void run() { c原创 2020-07-10 17:54:22 · 312 阅读 · 0 评论 -
C++面向对象之多态(虚函数的引入)
父类指针、子类指针◼ 父类指针可以指向子类对象,是安全的,开发中经常用到(继承方式必须是public)不会超出范围◼ 子类指针指向父类对象是不安全的编译不会报错,但是运行时就不一定了,因为new 的时候只申请了4个字节,而指针类型stu是8个字节多态默认情况下,编译器只会根据指针类型调用对应的函数,不存在多态多态是面向对象非常重要的一个特性同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果在运行时,可以识别出真正的对象类型,调用对应子类中的函数多态的要素子类重写父类的原创 2020-07-10 14:44:02 · 258 阅读 · 0 评论 -
C++面向对象之继承的本质
继承就是子类拥有父类的所有成员(变量\函数)C++中没有像Java、Objective-C的基类(即最开始的类继承自Object),只有父类和子类,子类继承自父类,父类没有继承任何一个类继承之对象内存布局下面代码,有3个依次继承的类,子类和父类中的成员在内存中是怎么排列的呢?父类的成员变量在前,子类的成员变量在后成员访问权限和继承方式class定义类成员默认privated,struct定义类成员默认publicclass定义类继承默认privated,struct定义类继承默认publi原创 2020-07-08 21:53:49 · 648 阅读 · 0 评论 -
C++中的命名空间
命名空间可以用来避免命名冲突Java考=靠不同目录的文件夹区别命名空间,C++不行,全部编译,发现有重复的就报错下面是C#里的命名空间,新建一个类就会有命名空间而在C++里默认是全局的命名空间:using namespace std;加上命名空间或如果只是使用自定义空间里的一个变量 可以使用 using 空间名::变量,这样以后就可以直接使用变量名解决下面的问题要在person p1 前加上命名空间,不能用std::person p1,因为std里只包含一些函数,这是我们自定义的函数原创 2020-07-08 17:20:57 · 323 阅读 · 1 评论 -
C++构造函数和析构函数(为什么要用和怎么用)
构造函数构造函数(也叫构造器),在对象创建的时候自动调用,一般用于完成对象的初始化工作特点函数名与类同名,无返回值(void都不能写),可以有参数,可以重载,可以有多个构造函数一旦自定义了构造函数,必须用其中一个自定义的构造函数来初始化对象注意通过malloc分配的对象不会调用构造函数,用new和(类 对象名这种方法)可以调用构造函数**错误结论:**默认情况下,编译器会为每一个类生成空的无参的构造函数正确理解:在某些特定的情况下,编译器才会为类生成空的无参的构造函数如当成员变量在类里已经原创 2020-07-08 16:26:09 · 2665 阅读 · 0 评论 -
C++面向对象的内存布局 二(堆空间)
堆空间在程序运行过程,为了能够自由控制内存的生命周期、大小,会经常使用堆空间的内存堆空间的申请\释放malloc \ freenew \ deletenew [] \ delete []注意申请堆空间成功后,会返回那一段内存空间的地址申请和释放必须是1对1的关系,不能回收一部分,不然可能会存在内存泄露现在的很多高级编程语言不需要开发人员去管理内存(比如Java),屏蔽了很多内存细节,利弊同时存在利:提高开发效率,避免内存使用不当或泄露弊:不利于开发人员了解本质,永远停留在A原创 2020-07-08 10:17:40 · 295 阅读 · 0 评论 -
指针(pointer)与引用(reference)
constconst是常量的意思,被其修饰的变量不可修改如果修饰的是类、结构体(的指针),放在数据类型(int)前后没有区别,其成员也不可以更改const修饰的是其右边的内容指针(point)引用(Reference)在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值在C++中,使用引用(Reference)可以起到跟指针类似的功能引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)对引用做计算,就是对引用所指向的变量做计算在定义的原创 2020-07-07 20:17:55 · 1182 阅读 · 0 评论 -
在C++中学习汇编语言
汇编的分类汇编指令movcall原创 2020-07-07 18:06:47 · 907 阅读 · 0 评论 -
VS查看内联函数的本质和宏
什么是内联函数使用inline修饰函数的声明或者实现,可以使其变成内联函数 (建议声明和实现都增加inline修饰)特点1.编译器会将函数调用直接展开为函数体代码2.可以减少函数调用的开销3.会增大代码体积注意 尽量不要内联超过10行代码的函数有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数适用于函数体代码较小且频繁调用的函数#include <iostream>using namespace std;inline int sum(int v1, i原创 2020-07-05 14:52:25 · 911 阅读 · 0 评论 -
C++的函数重载(overload)
什么是函数重载Long i=10 隐式地把int类型的10转化成long类型Long i=(int)10 显示转换只能小的转大的,大的类型不能转化为小的类型出现的原因——namemangling技术改变了函数名利用反汇编查看区别机器码这里16进制表示,2个16进制代表一个字节;内存是连续的;机器码存储在exe文件中,载入内存才会有内存地址;如display方法占用了五个字节,call是调用的意思,调用的display(013c1429h)里的是函数的内存地址...原创 2020-06-17 21:35:38 · 445 阅读 · 0 评论