C/C++
beyond559
这个作者很懒,什么都没留下…
展开
-
typedef和#define的区别
typedef 的作用是将一个已知类型再重新取一个别名,有点和引用相似;引用是将一个类型的变量取一个别名typedef的具体作用:1、typedef可以将一个复杂的类型名取一个简单的、一目了然的名字eg: typedef long double Ldouble这里将 long double 另取了一个Ldouble的名字,使其在使用时变得更加简单;eg: typedef void(*V...原创 2019-02-21 17:15:40 · 225 阅读 · 0 评论 -
C++学习笔记之MyString的实现和迭代器
MyString类迭代器的特点:遍历所有容器的方法都是一样的,通过begin和end方法实现class CMyString{public: CMyString(const char*p = nullptr) { if (p != nullptr) { // 1.根据p指向得字符串得长度,开辟一块内存空间 mptr = new char[strlen(p) + 1];...原创 2019-04-07 11:27:33 · 147 阅读 · 0 评论 -
C++学习笔记之虚函数
面向对象程序设计的核心思想是数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承可以定义相似的类型并对其相似关系建模;使用动态绑定可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。在C++中,通过继承联系在一起的类构成一种层次关系,通常在层次关系的根部有一个基类,其他类直接或间接的从基类继承而来,这些继承来的类称为派生类。基类负责定义在层次关系中所...原创 2019-04-08 20:35:47 · 258 阅读 · 0 评论 -
C++学习笔记之顺序容器
一个容器就是一些特定类型的对象的集合。顺序容器就是为程序员提供了控制元素存储和顺序访问的能力。这种顺序不依赖于元素的值,二是与元素加入容器时的位置控制相对应。顺序容器的类型有**vector:**向量容器①底层实现是一个大小可变的一维数组:按2的次方来扩容(0,1,2,4,8,…)②支持快速访问 ,通过operator[] 来实现随机访问, 时间复杂度为O(1);③通过迭代器来遍历,...原创 2019-04-15 23:43:05 · 117 阅读 · 0 评论 -
C++学习笔记之迭代器
所有的标准库容器都可以使用迭代器,迭代器的主要目的是用来遍历容器的,虽然每个容器的的底层的实现不一样,但对于迭代器来说,对容器的遍历都是一样的,都封装到迭代器的函数中。每个容器都有自己的迭代器的实现,所以在外部开来,操作都是一样的。泛型算法的接受对象都是迭代器。类似于指针,迭代器也提供了对对象的间接访问。通过解引用迭代器,就能访问容器中的元素。迭代器也能从一个元素移动到另一个元素,可以通过重载+...原创 2019-04-16 01:01:34 · 321 阅读 · 0 评论 -
C++学习笔记之继承和多态
在C++中类和类的基本关系有:代理、组合、继承代理:可以从容器适配器中可以体现,就是一个类是另一个类的接口,通过这个类,可以访问另一个类的方法。组合:就是一个类是另一类的成员,用一个类定义的对象,作为另一个类的成员变量继承:简单的说,一个类拥有另一个类的成员或方法现在就来介绍一下继承继承方式:派生类的内存布局:派生类不仅有自己的成员还直接或间接地继承了基类的成员,最重要的是派生类还...原创 2019-05-01 18:58:43 · 137 阅读 · 0 评论 -
系统调用函数和库函数的区别
系统调用函数:一台计算机的最低层是硬件设备,通过操作系统来管理这些硬件,如果操作系统是封闭的则这些硬件将无法被其他程序来使用。我们知道操作系统本身也是一个程序,只不过是系统级别的,为了能让其他的程序也能够访问这些硬件设备,操作系统给出了一些接口,这些接口就是我们所说的系统调用函数。通过这些接口就可以访问计算机的硬件设备。系统调用函数运行在系统的内核态,而调用则由用户调用,所以在用户态。这里就需要...原创 2019-05-02 12:00:43 · 734 阅读 · 0 评论 -
什么是内存对齐以及作用
什么是内存对齐?为了解释这个问题,先来介绍下面的例子:#include<iostream>using namespace std;struct A{ char a; short b; int c;};struct B{ short b; int c; char a;};int main(){ cout<<sizeof(A)&...原创 2019-05-04 11:15:47 · 5690 阅读 · 0 评论 -
指针定义相关的用法:
int a; //定义一个整型的变量 a;int a[];//定义一个整型数组;int *a ; //定义一个整型指针int a();//声明一个返回类型为整型,参数列表为空的函数名为a的函数int (*a)[10];//定义一个指向一个元素类型的整型,元素个数为10的数组的指针int *a[10];//定义一个元素类型为整型指针,元素个数为10的数组int *a(); //定义声...原创 2019-05-04 11:51:07 · 127 阅读 · 0 评论 -
C++ list容器的splice方法
list容器底层实现是一个带头结点的双向链表,由于链表的每个节点是单独开辟的,所以链表在移动数据,或者两个链表之间移动数据的时候,直接把节点摘下来,接入到新的位置就可以了,效率比较高。splice方法就是将list的元素进行拼接,原理就是改变结点指针的指向,效率比较高。先看看这splice方法的三种声明:(1)void splice ( iterator position, list<...原创 2019-05-26 12:59:15 · 3316 阅读 · 0 评论 -
STL容器之vector容器的resize和reserve函数的区别
vector:vector的底层实现是一个可2倍扩容的数组,刚开始时候是没有空间的,随着元素的增加而进行二倍的扩容,扩容的方式为0-1-2-4-8-16…所以vector的内存使用的效率比较低,一般使用reserve来进行优化。现在就来讲讲reserve和resize函数的区别:reserve这个函数的功能为给容器预留空间而不会增加元素的个数,而resize这个函数不仅会给vector开辟空...原创 2019-05-23 12:36:45 · 443 阅读 · 0 评论 -
C++学习笔记之运算符重载
运算符重载运算符重载的意义:运算符的重载,让对象的运算表现得和内置类型一样左边的对象,调用相应运算符的重载函数,把剩下的内容当作实参传递进去运算符重载函数调用优先级:编译器会从1.成员方法找相应得运算符重载函数2.从全局找运算符重载函数重载示例:// 复数类class CComplex{public: //CComplex() CComplex(int) CComplex...原创 2019-04-07 11:06:24 · 88 阅读 · 0 评论 -
C++学习笔记之模板编程
模板编程函数模板template // 模板参数列表,可以包含多个参数bool compare(const T a, const T b){return a > b;}模板可在编译阶段,调用点进行实例化生成模板函数,在最终一起参与编译形成一个obj文件。但模板不参与编译,如果没有调用模板函数的话,编译器是不会检查模板内的错误的。模板可以有类型参数和非类型参数,非类型参数是一个...原创 2019-04-07 10:26:01 · 190 阅读 · 0 评论 -
C++学习笔记之面向对象基础
面向对象基础如何理解OOP:说到OOP就不能不说类了,类实际上是对一个实体的抽象化描述,而一个实体包含有属性和行为两种性质,所以类就从这两种性质来描述一个实体;通过将实体的属性转换为成员变量,把行为转换为成员方法;通过类实例化的每一个对象都有自己的独立的成员变量,而共享一套成员方法。这就像每一个人都是不一样的,都是独立的个体,而每个人可能会做同一件事情。而才C++中,通过一个this指针来区别...原创 2019-04-07 10:10:26 · 157 阅读 · 0 评论 -
C++浅拷贝和深拷贝的区别
什么时候会使用拷贝构造函数:当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:(1)一个对象以值传递的方式传入函数体(2)一个对象以值传递的方式从函数返回(3)一个对象需要通过另外一个对象进行初始化。如果在类中没有显式地声明一个拷贝构造函数,那么,编译器...原创 2019-02-17 16:38:21 · 1014 阅读 · 0 评论 -
C/C++中结构体和类的区别
结构体是为能够保存不同类型的数据而存在的,因为数组朱能够保存一种数据类型,而在平时的编程中我们需要用到不同数据类型的一个整体结构,例如一个学生就有不同的属性,姓名,年龄,学号,性别等等,就需要用不同的数据类型来保存这些属性。这时就要用到一个新的数据类型来保存这些不同的数据类型的数据的集合。结构体就是这样新的数据类型。C/C++中结构体的区别:1、C中的结构体是能够封装c语言中已经存在的数据类...原创 2019-02-17 16:39:05 · 7168 阅读 · 0 评论 -
C++面向对象基础
(1)struct在C语言中,struct是结构体,只有成员变量,不能有成员方法,不可以为空,因为一旦定义为空,占的内存也为零,这样它定义变量的地址和之后的其他变量的内存地址就一样的了;而在C++中struct是类可以为空(成员变量为空,但成员方法(四个默认的方法)不为空,占的空间为1,siezof=1);struct 的默认访问属性是publicclass 的默认访问属性的private(...原创 2019-02-17 16:39:41 · 129 阅读 · 0 评论 -
函数调用过程
1.概要(1)函数参数带入(2)函数栈帧开辟(3)函数返回值返回(4)函数栈帧回退(5)三种调用约定的区别2.内容详情(1)函数参数的带入①参数带入顺序int fun1(int a, int b){int c = a + b;return c;}int main(){int a = fun1(10, 20);return 0;}调试进入main函数栈帧,EB...原创 2019-02-17 16:39:59 · 147 阅读 · 0 评论 -
编译连接过程原理
(1)虚拟地址空间划分如图1.1,32为操作系统共有4G的虚拟地址空间,其中低3G(0x0000 0000—0xc000 0000)为用户空间,高1G(0xc000 0000—0xffff ffff)为内核空间。用户空间是每个进程独有的,而内核空间是所有进程公用的,但是用户进程不可以直接访问内核空间。用户空间的低258M(0x0000 0000 — 0x0804 8000)属于预留内存,进程不...原创 2019-02-17 16:40:22 · 217 阅读 · 0 评论 -
C++学习笔记之C/C++的区别
面向对象的程序设计的三个特征:封装,继承和多态。封装是将数据和代码捆绑在一起,在C++中是通过类来实现。访问权限符:public:表示该成员可以在和该类对象处在同一作用域内的任意函数中使用。private :表示该成员只能和它所在类的·成员函数和该类的友元函数中使用。protected:声明该成员只能被它所在类及从该类派生的子类的成员函数和友元函数中使用。类是一种数据类型,系统不会为其...原创 2019-03-27 00:42:21 · 117 阅读 · 0 评论 -
Const 、引用、inline、static和宏的区别
1、①const修饰的量是常量,不允许改变常量的值,在编译期出现常量使用值的时候,都被替换为常量值。且必须在声明时就初始化。const修饰的类型是离它最近的成型的类型,修饰的内容是除类型之外的;常量的值不能被修改且不能泄露常量的地址给非常量的指针。②C语言中,const是常变量,在C++中const是常量,不允许修改常量的值,在编译期出现使用常量值的地方都被替换为常量值:eg:const in...原创 2019-03-01 18:09:15 · 206 阅读 · 0 评论 -
C语言关键字
关键字一、C语言的关键字一共有32个,除了常见的以外,现在列举几个不常见的关键字:auto、register、volatile、extern、sizeof;二、常用关键字的使用和注意事项:①auto:声明自动变量,缺省是编译器一般默认为auto;②register:最快的关键字,尽可能的将变量存在CPU的寄存器中,而不是通过内存寻址访问来提高效率;注意是尽量而不是绝对,因为寄存器的数...原创 2019-03-29 00:25:30 · 535 阅读 · 0 评论 -
数组名使用的三个特殊的地方
一个数组的属性包含有类型和大小,在编译期确定。以下三种情况都会进行类型检查。int ar[10];1、sizeof(ar)计算数组的大小,这里表示的意思是数组名而不是数组首元素的首地址,这里会进行类型的检查,sizeof得到的结果就是选用了数组的大小这个属性。2、int (&amp;ar)[10]=br;这里的ar表示的数组名,表示数组的引用,给数组ar取了一个别名br;3、int(*...原创 2019-03-08 17:24:06 · 148 阅读 · 0 评论 -
C++中的多态分析
C++中的多态,可以理解为就是多种形态,也就是对不同的对象发送同一个消息,不同的对象会作出不同的响应;多态分为静态和动态多态静态多态就是在编译阶段就可以确定程序的具体执行,比如函数的重载,模板,使用对象名点访问成员函数等,这些都可以在编译阶段就可以确定下来。其中函数重载就是通过不同的函数符号名来区分调用,模板也是在编译阶段对不同类型,作出不同的实例化,而对象名通过点访问成员函数就是通过thi...原创 2019-04-06 13:43:58 · 194 阅读 · 0 评论 -
C++多重继承带来的构造函数的执行顺序的问题
在C++中是支持多重继承,而继承也分为虚基类的普通的基类,在派生类里面可能还有其他类的成员对象,自身还有自己的构造函数,这些夹杂在一起,导致我们不能立即判断出每一个构造函数的执行顺序,现在就来测试一下吧。class Base{public: Base() { cout << " this is Base" << endl; }};class VBa...原创 2019-08-15 11:36:53 · 598 阅读 · 0 评论