c++
文章平均质量分 92
CC_YXK
这个作者很懒,什么都没留下…
展开
-
c和c++的区别(二)
constc语言中const修饰的量为常变量,可以通过一定的方法修改其值,如下代码:# include<stdio.h>int main(){ const int i = 20; int *p = &i; *p = 30; printf("%d\n", i); return 0;}c++中const修饰的量为常量,值不允许改变(改变不了)。在编...原创 2018-11-17 15:08:11 · 132 阅读 · 0 评论 -
继承多态常见类型题目
1、类的编译顺序,类的构造顺序,子类构造顺序,子类析构顺序类的编译顺序:类名 ---> 成员名 ---> 方法体子类的构造顺序:先构造父类,再构造子类子类的析构顺序:先析构子类,再析构父类2、重载,隐藏,覆盖重载:1、作用域相同 2、函数名相同 3、参数列表不同隐藏:子类隐藏父类同名的方法覆盖:子类覆盖父类相同...原创 2019-01-13 23:24:23 · 224 阅读 · 0 评论 -
MVC编程模式
什么是MVC编程模式?MVC编程模式的构成MVC编程模式的优点一、什么是MVC模式? MVC模式是软件工程中的一种软件架构模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里边,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。 而MVC编程模式是一种使用MVC设计模式创建web应用程序的模式。二、MVC编程模...原创 2019-02-21 21:07:11 · 488 阅读 · 0 评论 -
static
static在面向过程和面向对象设计中有不同的用法:在面向过程设计中的static应用于普通变量和函数,不涉及类 面向对象设计中的static主要说明static在类中的应用一、面向过程设计中的static1、静态全局变量在全局变量前加上static关键字,该变量就被定义成一个静态全局变量。特点:该变量在全局数据区分配内存 未经初始化的静态全局变量会自动初始化为0(非静态...原创 2019-02-21 22:36:28 · 226 阅读 · 0 评论 -
struct和class的区别
C++中的struct已经不同于C语言中的struct,C++中的struct几乎和class具有相同的功能,差别十分细微,在C++语法上,class和struct主要有以下3点区别:1、默认继承权限struct默认的继承权限是public class默认的继承权限是private2、成员的默认访问权限struct默认的访问权限是public class默认的访问权限...原创 2019-02-22 16:13:18 · 193 阅读 · 0 评论 -
写时拷贝技术
写时拷贝的主要思想是在复制原来实体的时候,如果复制后的实体不需要进行改变,那么实际上没必要进行实体内容的拷贝,只需建立一个引用指向原来的实体内存,直接应用原来的实体内容即可,只有当需要对复制后的实体进行修改的时候才进行内容的拷贝。 写时拷贝技术在很多方面都有应用,典型的有:C++中的写时拷贝技术 Linux中的写时拷贝技术一、C++中的写时拷贝技术 ...原创 2019-02-22 19:56:20 · 378 阅读 · 0 评论 -
迭代器失效
1、顺序容器:vector和deque迭代器失效首先我们来了解一下vector和deque的扩容方式当声明迭代器的时候,并不会预开辟内存。 当向迭代器中加入第一个元素的时候,开辟1个单元内存 此后再添加元素,当内存填满之后,会重新分配一块更大的内存,将旧的数据和添加的数据放入新的内存块中,释放旧的内存块 扩容的内存大小根据不同的编辑器有所不同,一般是1.5倍或者2倍vector和d...原创 2019-02-24 12:19:46 · 162 阅读 · 0 评论 -
虚函数的工作原理
虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。编译器必需要保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证正确取到虚函数的偏移量)。 每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就会为这个类创建一个虚函数表(VTABLE)保存该类所有虚函数的地址,在每个带有虚函数的类 中,编译器秘密地置入一...原创 2019-02-26 18:14:30 · 569 阅读 · 0 评论 -
结构体大小和类大小的计算
1、结构体大小的计算当为空结构体时,其大小为1 选取结构体中类型字节数最大的最为对齐符。注意:是最大的类型字节数,例如:int a[10],并不是以40作为对齐符 每次申请对齐符个字节大小的内存。 当内存不够时才继续申请。举例:struct A{ int a[10]; char b; double c;}//该结构体中最大的类型是double,所以对...原创 2019-02-26 18:19:50 · 1065 阅读 · 0 评论 -
重载、重写、隐藏、覆盖
重载:重载是指在同一作用域内,具有相同函数名但是参数列表不同的函数之间构成重载。总结为以下特征:同一作用域 函数名相同 参数列表不同重写:重写是在父子类之间,也叫做子类隐藏父类。子类拥有和子类相同返回值、函数名、参数列表但是函数实体不同的函数,这样的情况叫做重写。总结为以下特征:发生在在父子类中 返回值、函数名、参数列表均相同隐藏:子类会隐藏父类中同名的函数。总结为以下特征:...原创 2019-03-14 17:47:05 · 161 阅读 · 0 评论 -
C++空类默认的函数
构造函数 拷贝构造函数 析构函数 默认复制运算符 重载取地址运算符 重载取地址运算符const函数class MyClass{public: MyClass(const char * str = nullptr); // 默认带参构造函数 // 默认构造函数指不带参数或者所有参数都有缺省值的构造函数 ~MyClass(void); // 默认析构函数...原创 2019-03-20 14:39:37 · 532 阅读 · 0 评论 -
STL容器
1、顺序容器vector:底层实现是数组。分配内存的方式: 当定义vector的适合不分配内存,第一次插入元素分配一个单元的内存空间,之后每当分配的空间用完之后则进行扩容,扩容的倍数根据编译器而定。注意vector的扩容是重新开辟一块空间将原来的元素存入,而不是在原来的空间后边补充。 缩容则和扩容相反,同样是重新申请空间。迭代器的失效: ...原创 2019-03-19 11:53:10 · 203 阅读 · 0 评论 -
C++中的四种强制类型转换
C语言支持类型强制转换,C++为什么要引入其他类型转换C风格的转换格式很简单,但是有不少缺点的:转换太过随意,可以在任意类型之间转换。你可以把一个指向const对象的指针转换成指向非const对象的指针,把一个指向基类对象的指针转换成一个派生类对象的指针,这些转换之间的差距是非常巨大的,但是传统的C语言风格的类型转换没有区分这些。 C风格的转换没有统一的关键字和标示符。对于大型系统,做代...原创 2019-01-13 22:11:52 · 215 阅读 · 0 评论 -
继承与多态知识点
访问权限子类无法访问父类的private成员 父类的proected成员可以被子类(子类内部)访问,不可以被外部访问 private会被继承,但无法访问。(可以通过查看子类大小验证) 继承默认是private方式 父类中成员通过相应的继承方式继承给子类后,这些成员对于子类来说,访问权限以访问方式为最低级别(如果原成员访问级别比访问方式低,则原成员对子类来说访问权限不变)。例如,父类中变...原创 2019-01-13 21:11:42 · 464 阅读 · 0 评论 -
单例模式
什么是单例模式? 单例模式是一种软件(程序)设计模式,在它的核心结构中只包含一个叫做单例的特殊类。通过单例模式可以保证系统(程序)中,应该该模式的类一个类只有一个实例,即一个类只有一个对象实例。单例模式如何设计?将类的构造函数设置为private属性(保证外部不可以通过对象调用构造函数,即不可以通过类名直接创建对象) 通过类型作用于调用静态成员函数创建对象(此时还可以创建...原创 2019-01-02 22:46:05 · 99 阅读 · 0 评论 -
c和c++的区别(一)
1、函数参数的默认值(c++特有)在函数声明或定义的地方,给函数参数加上默认的参数,在函数调用处,可以不必给该参数传值,会默认传入默认值。参数默认值的赋值必须从右向左,依次赋值。参数默认值的作用域在同一作用域中,函数参数的默认值,不可以重复赋值。2、宏函数和内联函数(c++)宏函数:优点:1、不存在栈帧的开辟2、不存在参数的带入3、不存在参数的带出4、不存在...原创 2018-11-11 22:15:26 · 163 阅读 · 0 评论 -
编译链接原理
虚拟地址空间 32位计算机,每个程序都有4G的虚拟地址空间。首先虚拟地址空间分为两大块,一个是用户空间,一个是内核空间。用户空间占3G的大小,并且它是每个进程所独有的,它的开头128M存放的是我们无法访问的地方。.text段:它也叫指令段,顾名思义,它存放的是指令代码,在程序中,我们把局部变量定义(局部变量的定义是指令而不是数据)还有一些操作指令都存放在.text中。它的属...原创 2018-11-11 17:06:21 · 216 阅读 · 0 评论 -
函数调用栈
1、函数参数的带入参数带入顺序以如下代码为例:int fun(int a, int b){ int c = a + b; return c;}int main(){ int a = fun(10, 20); return 0;}调试进入main函数栈帧,EBP = 0x006FFC4C(不固定),ESP = 0x006FFC00(不固定)...原创 2018-11-05 22:52:43 · 321 阅读 · 0 评论 -
c和c++区别(三)
命名空间(c++)示例:fun.h# include<iostream>using namespace std;namespace A{ typedef int Int;};main.cpp# include<iostream># include"fun.h"using namespace std;using namespace A...原创 2018-11-17 18:08:53 · 142 阅读 · 0 评论 -
面向对象
在堆上实例化对象假定有一个Person类Person *p1 = new Person();/* 1、申请内存 2、调用构造 此处为new和malloc的一个区别,malloc只申请内存,不调用构造函数*/在堆上实例化的对象不会自动调用析构函数,必须手动析构delete p1;/* 1、先调用析构函数 2、再释放内存 此处为...原创 2018-11-18 16:28:56 · 135 阅读 · 0 评论 -
对象生存周期
构造函数:初始化对象的时候自动调用成员方法 如果不自己实现,编译器会默认生成一个默认构造函数 如果自己实现,则编译器不会生成 构造函数可以重载拷贝构造:用一个已经存在的对象,构造同类型的新对象 防止浅拷贝 如果不自己实现,默认生成一个浅拷贝的拷贝构造 拷贝构造函数必须传引用(防止递归拷贝构造)重载= :用一个已经存在的对象给另一个已经存在的对象赋值 如果不自己实现,...原创 2018-11-18 14:33:14 · 260 阅读 · 2 评论 -
函数模板
函数重载通常用于执行相似的操作,这些操作涉及作用于不同数据类型上的不同程序逻辑。如果对于每种数据类型程序逻辑和操作都是相同的,那么使用函数模板可以使重载执行起来更加紧凑方便。 程序员需要编写单个函数模板定义。只有在这个模板函数调用中提供了实参类型,c++就会自动生成独立的函数模板特化来恰如其分地处理每种类型的调用。这样,定义一个函数模板实质上就是定义了一整套重载的...原创 2018-11-28 11:30:48 · 158 阅读 · 0 评论 -
类模板
类模板也称作参数化类型或者容器,因为它们需要一个或多个参数类型,来说明如何自定义一个用于产生类模板特化的通用类模板。想要产生多个类模板特化,只需要定义一个类模板。当需要一个特定的类模板特化时,使用简洁的表示方法,编译器就会写出类模板特化的源代码。 类模板和函数模板类似,也具有以下特点:类模板不编译 模板的作用域只在当前 类模板与函数模板很大的区别在...原创 2018-11-28 11:53:57 · 219 阅读 · 0 评论 -
STL容器---string
1、string是什么string是专门对字符串操作的一个类。2、string和char*的区别char*是指向字符数组的指针,然后系统提供了一个string.h,这个头文件声明了很多字符串操作函数。string则是一个类,这个类将以上的内容封装在一起,使得字符串的操作更灵活,方式更多、管理更灵活string这个类。我们使用的时候不用考虑内存的分配与释放,不用担心越界崩溃。因为...原创 2018-12-03 13:35:22 · 140 阅读 · 0 评论 -
内存池
什么是内存池? 当我们使用new或者malloc申请内存的时候会调用系统调用,这样就会进行用户态到内核态的切换,如果频繁进行内存申请就会造成频繁的用户态内核态之间的切换,从而导致程序效率低下。 我们可以事先申请一块很大的内存,称之为内存池,之后每次申请就从内存池中申请,释放就又还给内存池,只有当内存池中的内存用光之后再继续向系统申请,这样可以大大减少用户态和内核态之间...原创 2019-01-03 21:57:29 · 162 阅读 · 0 评论 -
智能指针
什么是智能指针? 智能指针是一个类,这个类的构造函数中传入一个指针,析构函数中释放传入的指针。智能指针都是栈上那个的对象,所以当函数(或程序)结束时都会被自动释放。为什么要使用智能指针?在堆区申请空间往往会遇到以下问题:1、内存被不正确的释放,例如下代码:void fun(int *p){ *p = 5; cout << *p <...原创 2019-01-01 12:18:54 · 228 阅读 · 0 评论 -
单例模式的双重if判断与线程安全
单例模式单例模式是指设计一个只能构造一个对象的类。简单来说就是在一个进程运行过程中只可以存在一个该类的对象。单例模式的对象获得设计方式A* getA(){ if(_a == NULL) { lock() if(_a == NULL) { _a = new A(); } }...原创 2019-03-28 17:21:59 · 1508 阅读 · 0 评论