
C++
Chan_Keh
https://github.com/chankeh
展开
-
关于拷贝构造函数的调用方式
通常构造函数只在对象创建时被调用,而拷贝构造函数则在以下3种情况下被调用。1。当使用类的一个对象去初始化该类的另一个新对象时。2。如果函数的形参是类的对象,那么当调用该函数时拷贝构造函数也会被调用。3。如果函数的返回值是类的对象,那么函数执行完成返回调用者时。原创 2017-02-24 13:29:36 · 474 阅读 · 0 评论 -
C++后端开发面试题
后端开发面试题后端开发面试知识点大纲:语言类(C++):关键字作用解释:volatile作用Volatile关键词的第一个特性:易变性。所谓的易变性,在汇编层面反映出来,就是两条语句,下一条语句不会直接使用上一条语句对应的volatile变量的寄存器内容,而是重新从内存中读取。Volatile关键词的第二个特性:“不可优化”特性。volatile告诉编译器,不要对我这个变量进行各种激进的优化,甚至将原创 2017-08-18 10:35:51 · 1323 阅读 · 2 评论 -
iterator迭代器和指针的区别
iterator迭代器和指针的区别 迭代器与指针的差别:迭代器: (1)迭代器不是指针,是类模板,表现的像指针。他只是模拟了指针的一些功能,通过重载了指针的一些操作符,->,*,++ –等封装了指针,是一个“可遍历STL( Standard Template Library)容器内全部或部分元素”的对象, 本质是封装了原生指原创 2017-08-18 17:12:50 · 645 阅读 · 2 评论 -
open/read/write和fopen/fread/fwrite的区别
(1)open/read/write是系统调用,而fopen/fread/fwrite是C语言标准库函数,后者是对前者的封装,后者的可移植性比较好。(2)open/read/write是通过文件描述符对文件进行管理的,只能读取二进制文件或文本文件,而fopen/fread/fwrite是借助文件结构体指针FILE *来对文件进行管理,可以读写字符、字符串、格式化数据,也可以读写二进制数据。(3)op原创 2017-08-12 22:24:26 · 826 阅读 · 0 评论 -
将无序的数组转换成堆
给出一个整数数组,堆化操作就是把它变成一个最小堆数组。对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。样例 给出 [3,2,1,4,5],返回[1,2,3,4,5] 或者任何一个合法的堆数组挑战 O(n)的时间复杂度完成堆化说明 什么是堆?堆是一种数据结构,它通常有三种方法:push, pop 和原创 2017-08-13 10:14:10 · 4617 阅读 · 1 评论 -
重建二叉树
给定两个序列,根据前序和中序构造二叉树: 例如前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod原创 2017-08-13 21:41:03 · 182 阅读 · 1 评论 -
C++常见面试题
第一篇1、在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃?答:因为gets无法截断数组越界部分,会将所有输入都写入内存,这样越界部分就可能覆盖其他内容,造成程序崩溃。2、C++中引用与指针的区别答:联系:引用是变量的别名,可以将引用看做操作受限的指针;区别:1) 指针是一个实体,而引用仅是个别名;2)引用只能在定义时必须初始化,指针可以不初始化原创 2017-08-14 08:51:18 · 32912 阅读 · 0 评论 -
C结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域原创 2017-08-07 10:24:28 · 555 阅读 · 1 评论 -
非阻塞式socket的select()用法
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect、accept、recv或recvfrom这样的阻塞程序(所谓阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件的发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回)。可是使用Select就可以完成非阻塞(所谓非阻塞方式原创 2017-08-14 18:15:56 · 2407 阅读 · 0 评论 -
编程之美-链表专题
目录(?)[+]一单链表结点的删除删除单链表p指向的那个元素时间和空间复杂度尽量小二单链表的存取找出单链表的倒数第K个元素仅允许遍历一遍链表找出单链表的中间元素仅允许遍历一遍链表三单链表与环的问题判断单链表是否有环6形状如何找到环的入口如何知道环的长度带环链表的长度是多少四单链表与相交环的问题如何知道两个单链表无环是否相交如果两个单链表无环相交如何知道它们相交的第一个节点是什么如何知道两个单链表可能原创 2017-08-14 23:05:02 · 293 阅读 · 0 评论 -
迭代器失效问题讲解
迭代器失效问题-外链原创 2017-08-25 10:09:18 · 473 阅读 · 0 评论 -
二叉查找树,红黑树,AVL树,B~/B+树(B-tree),伸展树——优缺点及比较
二叉查找树(Binary Search Tree)很显然,二叉查找树的发现完全是因为静态查找结构在动态插入,删除结点所表现出来的无能为力(需要付出极大的代价)。BST 的操作代价分析: (1) 查找代价: 任何一个数据的查找过程都需要从根结点出发,沿某一个路径朝叶子结点前进。因此查找中数据比较次数与树的形态密切相关。 当树中每个结点左右子树高度大致相同时,树高为logN。则原创 2017-08-29 19:01:56 · 733 阅读 · 0 评论 -
多继承小记
#include <iostream>using namespace std;class A{public: virtual void f(){cout<<"A"<<endl;} void s(){cout<<"A:s"<<endl;}};class B:public A{public: virtual void f(){cout<<"B"<<endl;} v原创 2017-09-18 11:53:17 · 486 阅读 · 0 评论 -
函数对象---operator()
一个函数对象,即一个重载了括号操作符“()”的对象。当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。举个最简单的例子:[cpp] view plain copy print?class FuncObjType { public: void operator() () { cout<<”Hello C++!”<<endl;原创 2017-09-21 15:54:07 · 1428 阅读 · 0 评论 -
static修饰符的作用及应用
class StaticDemo{ static int count ;//系统默认初始化为0 static { count ++;//一旦加载即运行,且类存在的过程中只运行一次 System.out.println(count);//1 }}class ObjectDemo { public static void m原创 2017-08-10 19:32:23 · 484 阅读 · 0 评论 -
STL中的vector如何处理才可以避免内存碎片
答: 使用vector内的reserve函数。 reserve函数主要是为提升vector的效率而存在的,如果已知vector的大小,可以在初始化时为vector执行reserve操作,分配足够的内存空间,之后数据加入vector就不会造成内存再次分配,也可以减少内存碎片。另外reserve操作只分配内存空间,并不执行元素初始化,因此效率上要比resize要高,假如vector中存储的是复杂的对原创 2017-08-17 16:19:15 · 2627 阅读 · 0 评论 -
C++的static用法
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:[cpp] view plain copy print?#i原创 2017-08-17 10:05:52 · 487 阅读 · 0 评论 -
hpp文件与h文件
提起hpp文件,或许很多菜鸟会比较陌生,大家只知道.h文件,但是没听过hpp。实际上,hpp文件是将cpp文件混入h头文件中,在hpp文件内,实现与定义都包含在了同一个文件中,所以,该类的调用者只需要include这个hpp文件即可,无需再将cpp文件加到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不在生成单独的obj文件,采用hpp文件将大幅度减少调用project中的c原创 2017-04-17 23:30:43 · 1560 阅读 · 0 评论 -
对象管理资源
今天看了下Effective C++的条款13:以对象管理资源,感觉十分有理,特此做一下笔记。假设我们使用一个用来描述投资行为的程序库,其中各式各样的投资类型都继承自一个根类 Investment://投资类型继承体系中的root classclass Investment{ ...};这里呢,我们进一步假设这个程序库通过一个函数为我们提供Investment对象:Investment*原创 2017-04-18 23:10:50 · 407 阅读 · 2 评论 -
reinterpret_cast 运算符
允许将任何指针转换为任何其他指针类型。也允许将任何整数类型转换为任何指针类型以及反向转换。 语法:reinterpret_cast < type-id > ( expression )滥用 reinterpret_cast 运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。reinterpret_cast 运算符可用于 char* 到 int* 或 One原创 2017-07-11 14:37:52 · 1544 阅读 · 0 评论 -
static_cast、dynamic_cast、const_cast和reinterpret_cast总结
最近在准备面试,这里主要介绍C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结,需要的朋友可以参考下: 前言 这篇文章总结的是C++中的类型转换,这些小的知识点,有的时候,自己不是很注意,但是在实际开发中确实经常使用的。俗话说的好,不懂自己写的代码的程序员,不是好的程序员;如果一个程序员对于自己写的代码都不懂,只是知道一原创 2017-07-02 16:39:15 · 288 阅读 · 0 评论 -
引用和常量引用
引用(reference)用作对象的另一名字。在实际程序中,引用主要用作函数的形式参数。在这里,我们用独立的对象来介绍并举例说明引用的用法。引用是一种复合类型(compound type),通过在变量名前添加“&”符号来定义。复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。引用必须用和该引用同类型的对象初原创 2017-07-02 20:28:24 · 2420 阅读 · 0 评论 -
友元函数常见问题
因为友元函数没有 this 指针,则参数要有三种情况:要访问非 static 成员时,需要对象做参数;要访问 static 成员或全局变量时,则不需要对象做参数;如果做参数的对象是全局对象,则不需要对象做参数;以上,mark原创 2017-07-03 15:48:30 · 682 阅读 · 0 评论 -
LIB和DLL的区别
共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。 共有两种链接方式: 动态链接使用动态链接库,允许可执行模块(.dll文件或.exe文件)仅包原创 2017-07-04 22:02:35 · 388 阅读 · 0 评论 -
二叉搜索树的第K个节点
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution { int count =原创 2017-07-06 21:34:10 · 273 阅读 · 0 评论 -
在编译期求得结构体偏移量
struct X{ char a; float b; };//如何在编译期求得b的偏移量?//比如constexpr auto pb=offestof(X,b);//现在这个offsetof是运行期的,如何编译期求得?答:offsetof宏的实现原理为:#define offsetof(st, m) ((size_t)&(((st *)0)->m))所以,offsetof已经是编译原创 2017-07-20 21:15:49 · 504 阅读 · 2 评论 -
C++中一个空类的大小为什么是1?
深度探索c++对象模型中是这样说的: 那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址。 也就是说这个char是用来标识类的不同对象的 参考资料:深度探索c++对象模型原创 2017-07-08 21:13:32 · 3021 阅读 · 0 评论 -
解读关键字volatile
一.volatile是什么?volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。 二.编译器优化是什么意思?int i = 5;int a = i;……int b = i;编译器发现两次从i读数据的代码之间,并没有对原创 2017-07-08 21:20:30 · 208 阅读 · 0 评论 -
c++运算符重载总结
c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。1.一般运算符重载 在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,就是在类里原创 2017-08-07 19:30:33 · 360 阅读 · 0 评论 -
类体内的char data[0]
假设定义网络传输数据包为:class packet{ int size; void data[0];}0数组的作用是:维护数据包空间的连续性,这样还可以允许越界访问。 1.这个叫柔性数组,它的作用跟指针差不多,但是指针占空间,而它不占空间,这就意味 着可以节省空间。 2.该数组的内存地址就和它后面的元素地址相同,意味着无需初始化, 数组名就是后面元 素的地址,直接就能当指针原创 2017-08-07 23:11:15 · 559 阅读 · 0 评论 -
memcpy和memmove区别
memcpy 与 memmove 的目的都是将 N 个字节的源内存地址的内容拷贝到目标内存地址中。但当源内存和目标内存存在重叠时, memcpy 会出现错误,而 memmove 能正确地实施拷贝,但这也增加了一点点开销。原创 2017-08-07 23:26:34 · 237 阅读 · 0 评论 -
要转Java了,暂时告别C++
向每一个C++程序员致敬! 很多学编程的人认为,特别是初学者会认为:“我又不找C++的工作,为什么要学C++?”,就像“我又不找C语言的工作,为什么要学C语言”一样;其实答案不在于你做不做C++的工作,而在于你做不做编程行业的工作。道理很简单,打个比方如果你听到这样的话,估计你也晓得为什么了。“我是数学老师,不是语文老师,所以我不要学语文”这话看似正确,其实当你语文不好,你的数学表达能力也就欠佳,原创 2017-10-05 18:43:09 · 5549 阅读 · 7 评论