C/C++
C/C++
小魏同学i
这个作者很懒,什么都没留下…
展开
-
【C++】强制类型转换
C++中四种强制类型转换:static_cast, reinterpret_cast, const_cast, dynamic_cast1. static_cast(编译时类型检查)用于非多态类型之间的转换(静态转换),任何标准类型之间都可以用它,但它不能用于不相关类型之间的转换。主要有以下几种用法:用于基本的数据类型之间的转换,例如把int转换为char,把int转换为enum,但...原创 2018-07-28 16:25:51 · 192 阅读 · 0 评论 -
浅析C++中的explicit, mutable
explicitexplict用来声明构造函数,防止隐式的类型转换,避免不必要的错误。 当类的构造函数的参数只有一个的时候,或者所有的参数都有缺省值的情况下,我们可以利用一个内置类型去赋值一个类对象,就像下面的例子:class A{public : A(int a, int b = 10) : _a(a) , _b(b) {}priv...原创 2018-07-22 11:06:20 · 245 阅读 · 0 评论 -
【C++】设计一个类,只能在栈(堆)上创建对象
设计一个类,只能在栈上创建对象使用new运算符,对象会建立在堆上,也就是说只要不用new去创建对象就可以实现,我们知道new和delete分别调用了operator new和operator delete,如果我们把这两个函数声明为私有的,操作符new就不能用了。class A{public: A() { cout << "A()" <...原创 2018-07-17 16:30:32 · 358 阅读 · 0 评论 -
【C++】设计一个不能被继承的类
设计一个类,不能被继承在继承体系中: 基类public成员 基类protected成员 基类private成员 概括 public继承 仍为public成员 仍为protected成员 不可见 非私有成员访问属性不变 protected继承 变为protected成员 变为protected成员 不可见 非私有成员...原创 2018-07-14 15:08:05 · 1519 阅读 · 1 评论 -
【STL】模拟实现二级空间配置器
二级空间配置器的实现原理 二级空间配置器,当配置空间大于128字节时,调用一级空间配置器;当配置空间小于128字节时,采用了复杂的内存池整理方式,又称为次层配置:每次配置一大块内存,并维护16个自由链表(free list),下次再使用相同大小的内存时,则直接从free list中得到。如果用户释放了小块空间,free list还负责回收。同时,为了方便管理,16个自由链表维护的空间大小均是...原创 2018-06-09 22:31:19 · 298 阅读 · 0 评论 -
【STL】模拟实现一级空间配置器
STL的六大组件:容器、迭代器、适配器、仿函数、算法、空间配置器。 关于容器、迭代器、适配器、仿函数和算法,我们之前都有一定的了解。至于空间配置器,它是负责空间配置与管理,它是隐藏在一切组件背后的东西,因为STL的整个操作对象都在容器中,而容器的实现是一定需要空间配置器的。 为什么要用空间配置器,而不是malloc或者new呢?小块内存带来内存碎片的问题;小块内存频繁申请...原创 2018-05-19 22:39:45 · 216 阅读 · 0 评论 -
union与大小端
union是C语言中的一个关键字,它的用法其实与struct很相似。 union中的所有数据成员共用一个空间,同一时间只能存储其中的一个数据成员,并且所有的数据成员有相同的起始地址。例如:union U{ double d; int i; char c; float f;}u; 我们可以使用sizeof来检测一下上面例子的大小,可以...原创 2018-04-08 18:57:41 · 2088 阅读 · 0 评论 -
【C++】单链表面试题
链表是非常重要的内容,在面试时也是非常喜欢问的,下面是几个常见的面试题。说明:这些题目中的链表都是指无头单链表。 代码的实现涉及到部分C++的语法。typedef struct Node{ Node(const int& data) : _data(data) , _pNext(NULL) {} int _data; Node* _pNext;}*p原创 2017-11-10 22:56:44 · 754 阅读 · 0 评论 -
【C++】模拟实现定制删除器
在上一篇博客中,我们模拟实现了几种智能指针,这里我们在自己模拟实现的SharedPtr的基础上,分别利用仿函数和函数指针来定制删除器。为什么要定制删除器呢,如果我们用new开辟空间,那么需要用delete来释放,如果用fopen打开一个文件,那么我们需要用fclose来关闭,同理malloc与free对应,如果不匹配使用,那么程序就有可能会崩溃。1.利用函数指针的方法使用模板函数,在S原创 2017-11-05 21:49:44 · 427 阅读 · 0 评论 -
【C++】智能指针
在C++中,我们经常会用到动态开辟内存,需要我们自己维护,在出函数作用域之前,必须将管理的内存释放掉,否则就会造成内存泄漏,即使我们十分小心,但总有可能出错,因此便有了智能指针。RAII:资源分配即初始化:定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。1. auto_ptr,auto_ptr的实现机制是...原创 2017-11-05 21:27:09 · 244 阅读 · 0 评论 -
【C++】模拟实现String类
String类时C++中非常重要的一个类,模拟实现String类涉及到浅拷贝,深拷贝的问题。浅拷贝:在拷贝的时候,只是拷贝了指针的内容,而指针所指向的空间并没有变,两个指针指向同一块内存空间。在释放空间的时候,就会造成重复释放同一块内存空间而报错。深拷贝:在拷贝的时候,开辟一块和原指针指向的空间相同大小的空间,使新增加的指针指向新的内存,这样在释放空间时,就不会出现重复释放了。引用计数:...原创 2017-11-05 17:43:52 · 314 阅读 · 0 评论 -
【C++】类型萃取
在前面用模板写顺序表时,我们遇到了一个问题,如果用memcpy拷贝元素效率会比较高,但是对于string类型则会出现问题,这时就要用for循环来拷贝元素了因此,我们想到了对于内置类型(比如:int,double,char等类型),我们用memcpy实现拷贝元素,而对于String这样的自定义类型,我们使用for循环拷贝。这样,我们需要将内置类型和自定义类型进行区分。第一种,我们可以定义一个原创 2017-11-04 22:03:55 · 248 阅读 · 0 评论 -
【C++】通过模板实现一个通用的冒泡排序
如果让你写一个冒泡法,对一个数组进行排序,你会怎么写呢?相信你很快就会写出这样的程序void BubbleSort(int* arr, int size){ int i = 0; int j = 0; for (i = 0; i < size - 1; i++) { for (j = 0; j < size - 1 - i; j++) { if (arr[j] >原创 2017-11-04 18:16:48 · 2667 阅读 · 0 评论 -
【C++】虚函数在不同继承方式中的对象模型
虚函数的调用是通过查找虚表调用的,通过虚表找到函数的地址,从而调用对应的函数,而虚表则是放在对象的前四个字节里的。 通过基类的引用(或指针)调用虚函数时,调用基类还是派生类的函数,是根据运行时引用(或指针)的实际引用(指向)的类型确定,而调用非虚函数时,无论基类指向的是何种类型,调用的都是基类的函数。下面看看在不同继承方式下的对象模型有什么不同:1.单继承,派生类中没有对基类函数进原创 2017-11-01 12:31:27 · 272 阅读 · 0 评论 -
【C++】浅谈对模板的认识
如果要写出适合于所有类型的函数,你会怎么写? 首先想到的应该就是函数重载了吧,函数重载使非常容易想到的,但是却存在许多缺点。比如:只要有新的类型出现,就需要添加新的函数;如果函数只有返回值不同,函数重载就不能解决了,除此之外,还有函数体都相同,仅有类型不同,代码显得冗杂;不方便维护等问题。 其次,我们还可以想到借助公共基类,将通用的代码放到基类中,但是这样仍然难以维护代原创 2017-10-23 22:42:20 · 578 阅读 · 0 评论 -
【C++】模拟实现STL中的list
STL中的list是带头结点的双向循环链表,之前我们写过不带头结点的双向循环链表,在此基础上,增加了头结点和迭代器。结点的结构template struct Node{ Node(const T& data = T()) : _data(data) , _next(NULL) , _pre(NULL) {} T _data; struct Node* _next; st原创 2017-10-21 20:13:36 · 271 阅读 · 0 评论 -
【C++】用模板实现顺序表
使用模板写出来的类或函数,与类型无关,下面用模板实现顺序表template <typename T>class Vector{public: typedef T* Iterator; Vector()//构造函数 : _start(0) , _finish(0) , _endofstorage(0) {} Vector(const T* arr, size_t...原创 2017-10-15 22:48:59 · 586 阅读 · 0 评论 -
【C++】浅谈对多态的理解
浅谈对多态的理解多态是C++中面向对象设计里一个重要的内容。所谓多态是指一个实体同时具有多种形式,通俗来讲就是同一个操作对于不同的对象,可以有不同的结果。原创 2017-10-14 21:04:48 · 2118 阅读 · 0 评论 -
【C++】浅谈C++中的继承
C++中的继承,作为C++的三大特性之一,是C++中很重要的一部分1.继承的定义简单讲,继承就是在一个已经存在的类的基础上建立一个新的类,已经存在的类称为基类或父类,新建立的类称为派生类或子类。例如:爸爸继承爷爷的特性,儿子继承爸爸的特性。派生类的定义:class DeriveClassName:acess-label BaseClassName {}DeriveClassNa原创 2017-10-05 22:50:00 · 407 阅读 · 0 评论 -
【C++】实现双向循环链表
双向链表有两个指针域,一个指向下一个节点(_next),一个则指向上一个节点(_pre)。而双向循环链表则是在双向链表的基础上,其头结点的_pre域为尾节点,尾节点的_next域则为头结点。原创 2017-10-03 22:05:18 · 633 阅读 · 0 评论 -
【C++】实现复数类
用C++语言实现一个复数类,包括复数加、减、乘、除、加等、减等、乘等及除等8个运算符的重载。#include using namespace std;class Complex//复数类{ friend ostream& operator<<(ostream& _cout, const Complex& c);//重载<<操作符public: Complex(const doubl原创 2017-09-23 18:01:12 · 2032 阅读 · 0 评论 -
C语言 单链表
链表是一种常见的数据结构,它是动态地进行存储分配的一种结构。每一个存储单元称为一个节点,都由两部分组成,一个是存储数据的数据域,另一个是存储下一个节点地址的指针域。链表分为单向链表、双向链表,循环链表等;单链表还可以分为带头节点的和不带头节点的。一般的链表都是不带头节点的实现。下面是用C语言对单链表的简单接口实现:包括链表节点的创建、头插尾插、头删尾删、查找指定元素、删除指定元素等原创 2017-09-09 23:36:56 · 300 阅读 · 0 评论 -
模拟实现atoi函数
atoi函数原型为:int atoi( constchar *string );其功能是将一个数字字符串转换成int类型的整数,若数字前有空格,可以跳过空格。模拟实现此函数,初看之下,觉得此题简单,写了如下代码:int change(const char *p){ int num = 0; while (*p) { num = num * 10 + *p - '0';原创 2017-07-29 17:07:31 · 435 阅读 · 0 评论 -
C语言 注释转换
在编写代码中,经常会注释掉某段代码,C语言一般有两种方式:一种是/*xxxxxx*/,另一种是://xxxxx.第一种注释方式不能嵌套使用,在/与*的匹配上可能会造成理解错误,第二种注释可以注释掉一行,两种风格各有优缺点,今天讲一下怎样将第一种风格转换成第二种风格。虽然转换本身不难,但要考虑到匹配时会出现多种情况,在这里,我们用到了状态机编程的思想。定义四种状态:NUL_STATE(无状态原创 2017-07-29 16:35:44 · 450 阅读 · 0 评论 -
通讯录的进阶
上一篇博客,写了通讯录的简单版本,虽然需要的功能基本都有,但是仍然存在许多问题:1.当通讯录的实际人数只有几十个时,开辟500个人的信息的内存,显然会浪费,当通讯录人数多于500时,没有足够的内存去存储这么多人的信息;2.当程序退出时,输入的信息无法保存下来,程序再次打开时,原先输入的数据已经没有了。鉴于以上两点,对程序进行了改进:一方面,使用malloc,realloc,free等函原创 2017-07-21 14:38:46 · 363 阅读 · 1 评论 -
对结构体及位段的认识
在C语言里为了描述一些现实生活中比较复杂的东西,往往需要用到结构体。结构体就是用户自己建立的由不同数据类型组成的组合型数据结构。比如:描述一个学生,可能需要描述他的学号,姓名,成绩等。一. 声明及定义结构体变量有三种方法定义结构体变量1. 先声明结构体类型,再定义该类型的变量,例如:struct P{ inta; charc;};int m原创 2017-07-10 15:35:54 · 308 阅读 · 0 评论 -
结构体 静态通讯录的实现
结构体实现简单静态通讯录原创 2017-07-09 14:30:03 · 663 阅读 · 0 评论 -
C语言 string及memcpy,memmove函数的模拟实现
模拟实现部分字符串操作函数及内存拷贝函数原创 2017-07-07 21:52:38 · 408 阅读 · 0 评论 -
从源程序到可执行程序
刚开始学c语言时,我想很多人都会好奇一件事吧,那就是:我们用vc或者vs写的后缀为.c的源文件怎么变成后缀为.exe的可执行程序。今天学到了点这方面相关的内容,所以来分享一下,如果有错误之处,麻烦帮我改正。在ANSI C的任何一种实现里都分为:翻译环境和运行环境,两个不同的环境;翻译环境是在环境中源代码转化成可执行的机器指令;执行环境则是实际执行代码。 在翻译环境可以分为两大阶原创 2017-06-25 15:30:48 · 1959 阅读 · 0 评论 -
C语言 scanf在while循环里的无限循环
首先看一段代码#include int main(){ int i = 0; int input = 0; while (1) { printf("input a number:"); scanf("%d", &input); if (input > 0) { printf("这是正数\n"); } else if (input < 0) {原创 2017-05-01 15:59:15 · 26943 阅读 · 4 评论 -
c语言实现简单的三子棋
在VS编译器的小黑框框里实现5x5棋盘的的三子棋程序包括test.c(游戏测试)game.c(游戏源文件)和game.h(头文件)三个部分game.h#ifndef __GAME_H__#define __GAME_H__#define ROWS 5 //定义棋盘的行数#define COLS 5 //定义棋盘的列数#include <stdio.h>#inclu...原创 2017-04-16 14:38:23 · 561 阅读 · 0 评论 -
c语言 实现二分查找
将一组n个数分为两半,取arr[n/2]与待查找的数x比较,若arr[n/2]<x,我们只需在数组arr的右半部分继续查找,反之,则在左半部分继续查找,直至x=arr[n/2],算法终止。原创 2017-04-08 20:25:24 · 1038 阅读 · 0 评论 -
C语言 一元二次方程解的判定及浮点数大小的比较
一元二次方程解的判定及浮点数的比较原创 2017-04-04 18:13:27 · 1869 阅读 · 0 评论 -
用C语言 实现猜数字游戏
首先输入1表示开始游戏,输入0表示退出游戏,输入其他数字提示错误;接下来,输入一个猜的数字,计算机提示你猜大了或是猜小了,直至猜正确。#include #include #include void menu(){ printf("**********************\n"); printf("****1.play 0.exit****\n"); printf("**原创 2017-03-28 23:22:22 · 3834 阅读 · 2 评论 -
理解C语言中的数组和函数
#includevoid test1(int arr1[]){ printf("%d\n", sizeof(arr1)); //3}void test2(char arr2[]){ printf("%d\n", sizeof(arr2)); //4}int main(){ int arr1[10] = { 0 }; char arr2[10] = { 0 }; pr原创 2017-03-28 13:37:46 · 748 阅读 · 0 评论 -
用C语言 将三个数从大到小排序
#include int main(){ double a = 0.0, b = 0.0, c = 0.0; double t = 0.0; printf("输入三个数:"); scanf("%lf %lf %lf", &a, &b, &c); if (a-b <= 1e-7) { t = a; a = b; b = t; /*a是a,b中较大的*/ } i原创 2017-03-23 20:55:25 · 11217 阅读 · 0 评论