c/c++
文章平均质量分 67
海阔天空sky1992
静 静
展开
-
浅析C++之封装、继承、多态
面向对象编程的三个基本特征:封装、继承和多态。一、封装1、什么是封装? 封装即隐藏对象的属性和实现细节,仅对外公开接口。在C++中就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,原创 2017-01-09 16:28:42 · 934 阅读 · 0 评论 -
C++之函数指针
函数指针:指向函数的指针。和其他指针一样,函数指针也是指向某个特定的类型。函数类型由其返回类型以及形参表确定,与函数名无关。如:bool (*pf) (const string &, const string &);上例将pf声明为指向函数的指针,它所指向的函数带有两个const string&类型的形参和bool类型的返回值。注意:*pf两侧的括号是必须要的,否则:bool *pf原创 2017-04-24 14:29:08 · 300 阅读 · 0 评论 -
C++之split字符串分割
在C++中没有直接对应的split函数,字符串分割可借助以下方法实现:1、借助strtok函数函数原型:char * strtok (char *str, char * delim);函数功能:以delim为分隔符分割字符串str参数说明:str:要分隔的字符串;delim:分隔符返回值:从str开头开始的一个个被分割的字符串。当没有被分割时则返回null代码1:直接使用s原创 2017-08-18 17:38:26 · 143043 阅读 · 6 评论 -
C++之string
头文件 #include支持长度可变的字符串。1、string对象的定义和初始化string s1; //默认构造函数,s1为空串string s2(s1); //将s2初始化为s1的一个副本string s3("value"); //将s3初始化为一个字符串字面值副本string s4(n, 'c'); //将s4初始化为字符'c'的n个副本2、string对象的读写原创 2017-03-22 16:11:49 · 355 阅读 · 0 评论 -
浅析C语言之内存分配函数malloc()、realloc()、calloc()
程序运行中动态分配内存,也就是从堆上分配内存,涉及到3个函数malloc()、realloc()、calloc()。1、malloc()函数原型: void * malloc( unsigned size);功能:分配一块长度为size个字节的连续区域。不进行初始化。可使用menset()初始化。返回值:该区域的首地址。可以将void*强制转换为需要的指针类型。2、calloc原创 2017-04-15 21:41:40 · 442 阅读 · 0 评论 -
C++之typedef和#define
1、#define作用:宏定义。通常用来定义常量。处理阶段:在预编译过程中处理。# 是宏的意思。宏处理器不会对C/C++程序有任何的感知。它只处理宏的语法,做简单的文本替换。例如:#define INT int#define TRUE 1#define Add(a,b) ( (a) + (b))#define Loop_10 for( int i = 0; i 2、ty原创 2017-04-15 22:20:23 · 422 阅读 · 0 评论 -
C++之内存对齐原则
首先由一个程序引入话题: 1 //环境:vc6 + windows sp2 2 //程序1 3 #include 4 5 using namespace std; 6 7 struct st1 8 { 9 char a ;10 int b ;11 short c ;12 };13 14 struct st转载 2017-04-14 19:04:32 · 1784 阅读 · 0 评论 -
C++之四个强制类型转换
如果两种类型相关,则可在需要某种类型的操作数位置上,使用该类型的相关类型对象或值。如果两个类型之间可以相互转换,称这两个类型相关。强制类型转换,又叫显式转换,包括四个操作符:static_cast、dynamic_cast、const_cast、reinterpret_cast。一般形式:cast_name(expression);cast_name:为四种类型转换之一type:转原创 2017-04-13 21:45:44 · 761 阅读 · 0 评论 -
C++之局部对象(自动对象和静态局部对象)
1、自动对象默认情况下,局部变量的生命期局限于所在函数的每次执行期间。只有当定义它的函数被调用时才存在的对象称为自动对象。自动对象在每次调用函数时创建和撤销。该类型局部变量存储在栈上,在动态存储区。局部变量所对应的自动对象在函数控制经过变量定义语句时创建。如果在定义时提供了初始化,那么每次创建对象时,对象都会被赋予指定的初值。对于未初始化的内置类型局部变量,其初值不确定。当函数调用时,自动原创 2017-04-14 15:17:19 · 4662 阅读 · 0 评论 -
浅析C语言之uint8_t / uint16_t / uint32_t /uint64_t
一、C语言基本数据类型回顾在C语言中有6种基本数据类型:short、int、long、float、double、char1、数值类型1)整型:short、int、long2)浮点型:float、double2、字符类型:char二、typedef回顾typedef用来定义关键字或标识符的别名,例如:typedef double wages;typedef wage原创 2017-05-10 16:05:51 · 307397 阅读 · 8 评论 -
浅析C语言之sprintf函数
1、头文件:#include2、函数原型:int sprintf( char *buffer, const char *format [, argument,...] );3、参数说明:1)buffer:要写入的字符串2)format:格式化字符串。使用格式化字符串来指定数据的格式。在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个原创 2017-05-09 10:59:06 · 821 阅读 · 0 评论 -
C++之虚函数表解析
转自:作者:陈皓链接:http://blog.csdn.net/haoel/article/details/1948051 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用转载 2017-04-10 20:21:45 · 347 阅读 · 0 评论 -
C++之派生类的构造函数和析构函数调用顺序
派生类的构造函数只负责对派生类新增的成员进行初始化,对所有从基类继承下来的成员,其初始化工作还是由基类的构造函数完成。派生类的数据成员是由所有基类的数据成员与派生类新增的数据成员共同组成的。如果派生类新增数据成员中包括有内嵌的其他类对象,派生类的数据成员中实际上还间接包括了这些对象的数据成员。因此,在构造派生类的对象时,就要对基类数据成员、新增数据成员和成员对象的数据成员进行初始化。派原创 2017-04-03 21:35:43 · 2771 阅读 · 0 评论 -
C风格字符串及常用库函数总结
我们知道字符串字面值的类型就是字符串常量的数组,即const char类型的数组。C++从C语言里继承下来的一种通用结构是C风格字符串(C-style character string),而字符串字面值就是该类型的实例。C风格字符串:以空字符null结束的字符数组。例如:char ca1[] = {'C', ''+ ,'+'}; //no null, not C-style strin原创 2017-03-22 22:18:24 · 623 阅读 · 0 评论 -
浅谈memmove 和 memcpy的区别
memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,原型分别如下:void *memcpy(void *dst, const void *src, size_t count);void *memmove(void *dst, const void *src, size_t count); 他们的作用是一样的,唯一的区别是,当内存转载 2017-08-21 20:19:28 · 690 阅读 · 0 评论 -
浅析strlen()和sizeof的区别
strlen()原创 2017-03-06 09:42:34 · 345 阅读 · 0 评论 -
C++之vector
头文件:#include 可以动态更改大小的数组。可以认为是数组的加强版。内部实现是动态数组。使用连续的存储位置。可以随机访问向量中的数据。当插入新元素时,若当前容量不够用了,则动态的分配一块当前大小capacity的1.5-2倍的新内存区。再将所有的元素复制进去。一般情况下,其访问效率同数组,只有重新分配发生时,其性能才有所下降。初始化:vector a;vec原创 2017-03-22 14:06:08 · 396 阅读 · 0 评论 -
简述C++中STL标准模板库
set原创 2017-03-12 21:56:32 · 895 阅读 · 0 评论 -
简述C++泛型化编程思想
1、泛型的基本思想泛型编程(Generic Programming)是一种语言机制,通过它可以实现一个标准的容器库。像类一样,泛型也是一种抽象数据类型,但是泛型不属于面向对象,它是面向对象的补充和发展。泛型编程在C++上的应用主要体现在两方面:函数模板和类模板,接下来我们通过两个例子说明。1)函数模板泛型,也就是我们说的任何类型,即不依赖于任何具体的类型。通常我们的操作都是依赖于具原创 2017-03-13 10:31:59 · 852 阅读 · 0 评论 -
浅析C++之指针和const限定符号
1、指向const对象的指针如果指针指向const对象,则不允许用指针来改变其所指的const值:const double *cptr ;*cptr = 42; //❌,不能用该指针修改其所指值也不能把一个const对象的地址赋给一个普通的、非const对象的指针,会编译错误:const double pi = 3.14;double *ptr = π //❌const do原创 2017-03-22 17:27:40 · 714 阅读 · 0 评论 -
C++之内联函数inline、带默认形参值的函数
1、内联函数函数调用时需要保存现场和修改地址,然后转移到子函数的代码起始地址去执行,子函数执行完后,又要取出先前保存的返回地址和现场状态,再继续执行。这一切都需要时间和空间方面的开销。内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。这样就节省了参数传递、控制转移等开销。但是却增加了遍以后代码的长度。因此对于一些功能简单、规模较小又使用频繁的函数,可以设计为内联原创 2017-03-28 22:18:54 · 1502 阅读 · 0 评论 -
C++之枚举类型enum
原创博客,欢迎转载,转载请注明作者和链接。声明形式:enum 枚举类型名 {变量值列表};例如:enum weekday {sun, mon, tue, wed, thu, fri, sat};枚举类型应用说明:1、对枚举类型按常量处理,不能对它们赋值,例如:sun = 0;//sun是枚举类型,此语句非法2、枚举类型具有默认值,它们依次是0,1,2,...例如上原创 2017-04-08 16:57:04 · 784 阅读 · 0 评论 -
字符串连接strcat()实现及常见问题
头文件:#include原型:char * strcat ( char * des, const char * src);功能:将字符串des的有效部分和src的有效部分连接在一起;实现:char * strcat(char *des, const char* src){ assert( (NULL != des) && (src != NULL) ); char * c原创 2017-03-06 20:52:16 · 3972 阅读 · 0 评论 -
字符串复制strcpy()实现及常见问题
原型:char* strcpy(char* des , const char* src),des 和 src 所指内存区域不可以重叠且 des 必须有足够的空间来容纳 src 的字符串。实现:char *strcpy(char *des, const char *src){ assert( (NULL!= des) && (NULL != src) ); char * address原创 2017-03-06 17:22:55 · 5520 阅读 · 0 评论 -
C++之cmath常用库函数一览
cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数。cmath中常用库函数:int abs(int i);//返回整型参数i的绝对值double fabs(double x);//返回双精度参数x的绝对值long labs(long n);//返回长整型参数n的绝对值double exp(double x);//返回指数函数e^转载 2017-03-19 21:31:09 · 34729 阅读 · 0 评论 -
C++中assert断言函数
assert宏的原型定义在assert.h中,1 #include "assert.h" 2 void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。assert()的用法像是一种“假设编程”,其表达的意思就是原创 2017-03-06 11:51:42 · 997 阅读 · 0 评论 -
string.h\cstring\string
转自http://blog.sina.com.cn/s/blog_6ce6d0bf010145or.html 首先,要明确的是cstring, string, string.h 是三个文件名,而不是类名,如果你将vs 2010(或者其它版本)安装在默认路径下,这三个文件可以在C:\Program Files\Microsoft Visual Studio 10.0\VC\inclu转载 2017-03-06 09:43:57 · 445 阅读 · 0 评论 -
栈的原理以及实现(基于数组)
栈的定义:限制仅在表的一端进行插入和删除运算的线性表。特点:后进先出。举例:物流装车,先装车的后出来,后装车的先出来。栈的结构:空栈:栈顶和栈顶都指向一个无用的头结点存有结点的栈:栈顶指针指向栈顶结点,栈底指针指向头结点举一个简单的例子:在往箱子里面放衣物的时候,放在最上面的衣物总是我们最后放上去的;而当我们从箱子里取出衣原创 2017-03-07 16:28:50 · 1369 阅读 · 1 评论 -
C/C++中内存区划分、堆和栈的比较
一、在C中分区1、栈 — — 由编译器自动分配释放。2、堆 — —需程序员分配释放,若程序员不释放,程序结束由OS回收。3、全局变量区 — — 即静态变量区。全局变量和静态变量的存储是放在一块儿的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束释放。4、常量区 — — 存储常量。程序结束释放。(a)函数体中定义转载 2017-03-08 13:53:09 · 544 阅读 · 0 评论 -
malloc()、free()和new、delete
头文件:#include 函数原型:extern void *malloc ( unsigned int num_bytes );功能:向系统申请分配指定size字节的内存空间。返回值:返回类型void* ,表示未确定类型的指针。C/C++规定,void * 类型可以强制转换为任何其它类型的指针。三、malloc与new的不同点 从函数声明上转载 2017-03-07 17:26:16 · 301 阅读 · 0 评论 -
C++之构造函数、拷贝构造函数、析构函数(节自《C++语言程序设计》第三版)
1、构造函数要理解构造函数,首先需要理解对象的建立过程。我们先来看看一个基本类型变量的初始化过程:每一个变量在程序运行时都要占据一定的内存空间,在声明一个变量时对变量进行初始化,就意味着在为变量分配内存单元的同时,在其中写入了变量的初始值。这样的初始化在C++源程序中看似很简单,但是编译器却需要根据变量的类型自动产生一些代码来完成初始化工作。对象的建立过程也是类似的:在程序执行过程原创 2017-03-28 23:19:20 · 628 阅读 · 0 评论 -
C++之命名空间
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函 数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情转载 2017-01-09 21:34:31 · 309 阅读 · 0 评论 -
字符串比较strcmp()实现及常见问题
头文件: #include 原型:int strcmp ( const char * s1, const char * s2 )功能:比较两个字符串的大小思路:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。若s1 == s2,返回0;若s1 > s2,返回正数;若s1 实现:int strcmp(const char原创 2017-03-06 20:54:11 · 8094 阅读 · 0 评论 -
常见字符编码简介:ASCII、Unicode、UTF-8、UTF16
一、字符集(Charset)一个系统支持的所有字符的集合。二、字符编码(Character Encoding)参考:http://www.cnblogs.com/yuguangchuan/p/4310952.htmlhttps://www.zhihu.com/question/23374078原创 2017-02-05 18:49:20 · 1938 阅读 · 0 评论 -
C++之bitset类的使用与简介
转自http://blog.163.com/lixiangqiu_9202/blog/static/53575037201251121331412/有些程序要处理二进制位的有序集,每个位可能包含的是0(关)或1(开)的值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供了bitset类使得处理位集合更容易一些。要使用bitset类就必须要包含转载 2017-03-26 22:24:55 · 496 阅读 · 0 评论 -
C++之static及其作用域
一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个全局变量和静态全局变量的例子,例如,在文件A中定义静态全局变量 i 和全局变量 j : #includeusing namespace std;static int i = 5;int j = 3;//默认为externint main()转载 2017-04-04 14:20:16 · 21339 阅读 · 6 评论 -
C++之friend友元类和友元函数
将数据和处理数据的函数封装在一起,构成类,实现了数据的隐藏,无疑是面向对象程序设计的一大优点。但是有时候封装不是绝对的。友元函数提供了不同类或对象的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。通俗的说,友元关系就是一个类主动声明哪些类或函数是它的朋友,进而给它们提供对本类的访问特性。也就是说,通过友元关系,一个普通函数或者类的成员函数可以访问封装于另外一个类中的数据。从一定原创 2017-04-10 21:44:38 · 7851 阅读 · 0 评论 -
C++之面向对象程序设计的基本特点(抽象、封装、继承、多态)
编写程序的目的就是描述和解决现实世界中的问题。第一步就是将现实世界中的对象和类如实的反映在程序中。面向对象程序设计的主要特点:抽象、封装、继承、多态。1、抽象定义:对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。两个方面:数据抽象和行为抽象。例1:加入我们要在计算机上实现一个简单的时钟程序,通过对时钟进行分析可以看出,需要3个整型数据来存储时间,分别表示时、原创 2017-04-09 22:05:13 · 8700 阅读 · 0 评论 -
C++之联合体union
有时需要使几个不同类型的变量共用同一组内存单元,这时可以声明一个联合体.联合体声明的语法形式:union 联合名{数据类型1 成员1;数据类型2 成员2;...数据类型n 成员n;}联合体类型变量声明的语法形式:联合名 变量名;联合体类型变量的引用形式:联合变量名.成员名;例如,有联合体类型声明如下:union uarea{ char c原创 2017-04-08 17:09:37 · 726 阅读 · 0 评论 -
C++之函数重载
在自然语言中,一个词可以代表多种不同的含义,需要依赖上下文来确定。这就是所谓的一次多意。反映到程序中就是重载。比如,我们说“开车”时,针对不同的车的类型(自行车、小汽车),但是所使用的方法截然不同。同样,在编程中我们可以对不同的功能赋予相同的函数名,编译时会根据上下文(实参的类型和个数)来确定使用的是哪一具体功能。1、函数重载的定义两个以上的函数,具有相同的函数名,但是形参的个数或者类原创 2017-04-09 21:46:42 · 482 阅读 · 0 评论