
c++
文章平均质量分 63
上流下流
这个作者很懒,什么都没留下…
展开
-
UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
类与类图1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。3) 类的属性即类的数据职责,类的操作即类的行为转载 2017-02-14 14:38:23 · 852 阅读 · 0 评论 -
静态库链接、动态库静态链接和动态链接
一、概念1.1、当我们建立一个项目(应用程序)它可以有很多种生成类型(应用程序.exe、动态库.dll、静态库lib),可以在创建向导时指定也可以在配置属性里更改。以vs2010为例,右键点击项目属性->配置属性->右侧配置类型中选择你需要生成的类型。1.2、当项目生成类型是静态库(.lib),程序会生成一个以项目名命名后缀为.lib的静态库文件。而当项目生成类型是动态库(.dll),程序原创 2016-03-30 15:51:14 · 1279 阅读 · 0 评论 -
回调函数
回调函数 在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。转载 2016-02-17 10:49:56 · 465 阅读 · 0 评论 -
C++的函数重载
——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了)2、当转载 2016-01-12 19:52:06 · 499 阅读 · 0 评论 -
指向函数的指针
可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:#include #include int max1(int x,int y){ int z; if(x>y) z = x; else z = y;转载 2015-10-14 13:09:06 · 661 阅读 · 0 评论 -
string类实现
#include #includeusing namespace std;class String{public: String(const char* str="");//通用构造函数 String(const String& another);//拷贝构造函数 ~String();//析构函数 String& operator =(const Stri原创 2015-09-24 11:14:38 · 448 阅读 · 0 评论 -
局部变量作为返回值
看看下面的程序的输出:#includechar *returnStr(){ char *p="hello world!"; return p;}int main(){ char *str; str=returnStr(); printf("%s\n", str); return 0;}这个没有任何问题,因为"hello转载 2015-09-22 10:40:03 · 1505 阅读 · 2 评论 -
C++默认参数与函数重载 注意事项
一、默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。注意:(1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在函数定义中设定。(#add ,此句意为存转载 2015-10-08 12:06:56 · 2497 阅读 · 1 评论 -
函数后面加const
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者转载 2015-09-17 18:43:54 · 513 阅读 · 0 评论 -
什么是复合类型
C++中,什么是复合类型?刚开始,还以为自定义的类是复合类型。查了C++ primer才知道复合类型不是类。在C++中类型大致可以分为三种一、内置类型如int, char, float, unsigned等。内置类型是最基本的类型。二、复合类型复合类型:使用其它类型定义的类型。有三种复合类型:引用,指针,数组。三、类类型就是类。比如string以及自己定义的类。转载 2015-09-17 11:47:46 · 789 阅读 · 0 评论 -
单例模式
singleInstance.h#ifndef SINGLEINSTANCE_H_#define SINGLEINSTANCE_H_class SingleInstance{private: SingleInstance();//防止用户类外定义对象 SingleInstance(const SingleInstance& ins);//防止用户用拷贝构造函数拷贝新对象publ原创 2016-05-05 15:02:41 · 496 阅读 · 0 评论 -
C语言中的左移与右移
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用int i = 1;i = i 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下转载 2015-08-17 15:11:39 · 1221 阅读 · 0 评论 -
Virtual、虚函数、指针、 引用、基类、父类
面试C++工程师碰到虚函数题目的概率为99%,昨天面试又碰到一个更经典的问题,先将这些整理,大家共同学习。#include using namespace std;class Base{public: int base; Base() { Virfun2();//好经典的问题 cout<<"Construct Base Obje原创 2015-07-22 17:41:29 · 657 阅读 · 0 评论 -
计算机中栈区,堆区,静态存储区,文字常量存储区,代码区的详细解释
一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存转载 2015-07-17 20:59:55 · 1031 阅读 · 1 评论 -
c++ 智能指针用法详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最转载 2017-02-13 19:01:38 · 803 阅读 · 0 评论 -
单例模式(Singleton)及其C++实现
单例模式(Singleton)及其C++实现众多设计模式中,单例模式比较常见的一种,面试和工作中也会经常接触到。本文以一个C++开发者的角度来探讨单例模式几种典型实现。设计模式经典GoF定义的单例模式需要满足以下两个条件:保证一个类只创建一个实例。提供对该实例的全局访问点。如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。实际工作中常见的应转载 2017-02-21 22:45:40 · 791 阅读 · 0 评论 -
详解大端模式和小端模式
详解大端模式和小端模式嵌入式开发交流群280352802,欢迎加入!一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯转载 2017-02-08 17:18:56 · 492 阅读 · 0 评论 -
c++ 类中static变量初始化问题
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数:[c-sharp] view plain copy print?void Foo() { static int a=3; // initialize std::cout a++; } 这里的st转载 2017-01-17 09:49:12 · 4854 阅读 · 0 评论 -
模板显式、隐式实例化和(偏)特化、具体化的详细分析
最近看了看到了模板的特化,突然想起来上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。 一下是我把再网上找的资料整理一下。 看着这么多叫法,其实就是三种。 1. 显示实例化 2. 隐式实例化 3. 特化(=具体化)、偏特化一、实例化1.显示、隐式实例化转载 2017-01-06 16:20:38 · 669 阅读 · 0 评论 -
C++模板
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让程序转载 2017-01-06 11:37:12 · 418 阅读 · 0 评论 -
字符串匹配的KMP算法
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上转载 2016-12-07 14:11:30 · 495 阅读 · 0 评论 -
string.h常用函数实现未完待续
#include #include #includeusing namespace std;原型:char* strcpy(char* dest, const char *src);说明:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。c原创 2015-09-15 18:31:17 · 757 阅读 · 0 评论 -
c/c++中delete/free 指针后,设置p=NULL的好处
从简单的代码开始: int* p = new int; *p = 5; delete p; p = NULL;Line4把释放了的指针立即设置为null,我们一般认识到是防止野指针的产生,从而导致程序崩溃。如: int* p = new int; *p = 5; delete p; *p = 12; //这里崩溃转载 2015-09-15 10:31:27 · 585 阅读 · 0 评论 -
对深拷贝与浅拷贝的再次理解
记得11年底找工作的时候,面试时曾经遇到有面试官问的对深拷贝与浅拷贝的理解,那时候自己回来查了资料,写了篇博客,感觉自己理解了,其实理解的不深刻,最近在调试bug的时候,再次遇到深拷贝与浅拷贝,认真分析了,写写自己的心得吧。 先说下自己的理解吧,浅拷贝,即在定义一个类A,使用类似A obj; A obj1(obj);或者A obj1 = obj; 时候,由于没有自定义拷贝构造函数,C+转载 2015-07-22 18:32:37 · 495 阅读 · 0 评论 -
C++空类中的默认函数
参加面试的时候,面试官问到这个问题,我的回答:默认构造函数、默认析构函数、默认拷贝构造函数、默认赋值函数。现在回想起来感觉不对,就google,揭示一下这个看似简单的问题: 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class A{}; 编译器处理后,就相当于: class转载 2015-07-22 18:08:58 · 498 阅读 · 0 评论 -
C语言中.h和.c文件解析(很精彩)
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可转载 2015-04-14 20:54:21 · 938 阅读 · 0 评论 -
inline函数的作用
在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵数。 可能说到这里,很多人还不明白什么是栈空间,其实栈空间就是指放置程序的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,如果频繁大量的使用就会造成因栈空间不足所造成的程序出错的问题,涵数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 (一)C转载 2015-07-31 15:56:32 · 1091 阅读 · 0 评论 -
循环冗余校验(CRC)
从奇偶校验说起所谓通讯过程的校验是指在通讯数据后加上一些附加信息,通过这些附加信息来判断接收到的数据是否和发送出的数据相同。比如说RS232串行通讯可以设置奇偶校验位,所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。比如我们要发送的字节是0x1a,二进制表示为0001 1010。采用奇校验,则在数据后补上个0,数据变为0001 1010 0,数据中1转载 2015-08-26 18:49:03 · 2219 阅读 · 0 评论 -
delete 和 delete []的真正区别
c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢?1.我们通常从教科书上看到这样的说明:delete 释放new分配的单个对象指针指向的内存delete[] 释放new分配的对象数组指针指向的内存那么,按照教科书的理解,我们看下下面的代码:int *a = new int[10];delete a;转载 2015-08-03 11:17:04 · 522 阅读 · 0 评论 -
C++输入cin详解
输入原理:程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入#1:#include using namespace std;int main(){转载 2015-07-11 23:23:41 · 616 阅读 · 0 评论 -
字典查询(部分)
#include #include #include using namespace std;const int enMax=46;const int chMax=256;const int attrMax = 66;const int spaceMax = 100;const int inputMax = 30;char atrrSum[13][attrMax]= {"n.","原创 2015-05-28 08:58:03 · 145258 阅读 · 1 评论 -
strcpy()、strncpy()、strlcpy()、strncpy_s()函数
strncpy()函数原型:extern char *strncpy(char *dest, char *src, int n); 用法:#include 功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。 说明:如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。 如果src的长度小于n个字节,转载 2015-08-03 17:35:31 · 1741 阅读 · 0 评论 -
匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。 举 例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为Switchboard时,变量全称应该为 frmSwitchboard。这样可以很容易转载 2015-08-04 13:59:50 · 558 阅读 · 0 评论 -
sizeof浅析——求结构体大小
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。 C语言中的构造数据类型有三种:数组、结构体和共用体。 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个转载 2015-09-11 23:46:01 · 485 阅读 · 0 评论 -
判断CPU是大端模式还是小端模式
//判断CPU是大端模式还是小端模式#include using namespace std;//1、同一个内存段可以用来存放几种不同类型的成员,//但是在每一瞬间只能存放其中的一种,而不是同时存放几种。//换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。//2、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。原创 2015-09-11 19:53:28 · 1388 阅读 · 0 评论 -
strlen和sizeof的区别
一、sizeof sizeof(...)是运算符,而不是一个函数。 一个简单的例子:int a;cout 在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。 它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。 由于在编译时计算,因此sizeof不能用来返回动态分配的转载 2015-07-23 18:51:48 · 419 阅读 · 0 评论 -
深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别
看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了。今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了‘\0’ ,‘0’, “0” 之间的区别了。困惑和快乐与你分享! 首先比较一下‘\0’和‘0’的区别。有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节。请翻开你的ASCII字符集表吧,一般在你的C语言转载 2015-09-11 21:21:41 · 555 阅读 · 0 评论 -
void和void*详解
void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型; 2. 如果函数无参数,那么应声明其参数为void; 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void * ; 4. void不能代表一个真实的变量;void体现了转载 2015-09-02 23:27:02 · 660 阅读 · 0 评论 -
C++ 定义实用比较函数(Custom Compare Function) 注意点
学过C++的应该都知道在调用sort算法的时候可以自定义比较函数(map, heap也都有类似的比较函数谓词的定义), 从而实现不同的排序比如可以从小到大或者从大到小,比如如下就是sort函数的申明(摘自cplusplus):template void sort (RandomAccessIterator first, RandomAccessIterator last, Compa转载 2015-09-25 16:36:33 · 2323 阅读 · 0 评论 -
C 风格字符串,C++string类,MFC,CString类的区别。
字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。1. 标准C中的字符串 在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。例如: char name[26]="This is a C-style string"; 或者转载 2015-09-02 14:16:49 · 902 阅读 · 0 评论