--------【C/C++语言】
奔跑吧,行者
这个作者很懒,什么都没留下…
展开
-
数据结构与算法-----总结篇
一、数据结构程序设计=数据结构+算法1.逻辑结构1)集合:元素之间没有联系。2)线性结构:元素之间存在前后顺序。3)树形结构:元素之间存在一对多的父子关系。4)图状结构:元素之间存在多对多的映射关系。2.物理结构1)顺序结构:用连续的空间存放数据元素。优点:便于随机访问。缺点:空间利用率低,插入删除不方便。2)链式结构:用不连续的空间存放数据元素,每原创 2015-06-17 17:09:30 · 3843 阅读 · 1 评论 -
C++【多重继承和虚继承】
多重继承和虚继承1)定义 子类同时拥有两个或两个以上的基类,同时继承了所有基类的属性和行为。 销售员 经理 \ / 销售经理 汽车 客用特性 商用特性 \ | / 公共汽车2)内存结构 按照继承表的顺序,从低到高地址一次排列各个基类子对象。将子类对象的地址隐式或者静态转换为基类指针,编译器会做地址计算,以保证基类指针的类型和其所原创 2015-06-16 12:02:54 · 758 阅读 · 0 评论 -
C++【浅谈虚析构函数】
虚析构函数 将基类的析构函数定义为虚函数,delete一个指向子类对象的基类指针,实际被执行的就是子类的析构函数,而子类的析构函数又会自动调用基类的析构函数,从而保证子类和基类中所有的资源都被析构干净。示例代码#include <iostream>using namespace std;class A {public: A (void) { cout << "A构造"原创 2015-06-16 11:16:16 · 748 阅读 · 0 评论 -
C++【子类的构造和析构】
子类的构造和析构 1.如果在子类的构造函数的初始化表中没有显式地指明基类部分如何初始化,那么系统就以以无参的方式初始化子类对象中的基类子对象,前提是基类类型支持无参构造。否则,就根据所指定的构造函数和参数对基类部分进行初始化。 2.构造和析构顺序 构造:基类->成员->子类 析构:子类->成员->基类 如果有多个成员,则按照其在类中被声明的顺序依次构造,如果有多个基类,则按照继承表的顺序依原创 2015-06-15 10:11:34 · 2092 阅读 · 0 评论 -
C++【静态成员】
关于静态成员的总结:1.静态成员是属于类的,而非静态成员是属于对象的。2.静态成员变量的定义和初始化只能在类的外部进行,而不能放在构造函数中。3.静态成员变量在该类的多个实例对象间共享。4.访问静态成员可以通过类也可以通过对象,但是访问非静态成员只能通过对象。5.静态成员函数只能访问静态成员,但是非静态成员函数既可以访问静态成员,也可以访问非静态成员。6.静态成员函数没有t原创 2015-06-12 13:25:49 · 670 阅读 · 0 评论 -
C++【操作符重载】
操作符重载的基本概念c1-(c2+c3)c1.sub (c2.add (c3));1.操作符和操作符函数1)双目操作符:+-*/%...,+=/-=...,>L#R -> L.operator#(R),左调右参 -> ::operator#(L,R),左一右二2)单目操作符:-/~/!...,++/--#O/O# -> O.operator#() -原创 2015-06-12 11:24:59 · 711 阅读 · 0 评论 -
C++【构造函数与析构函数基础知识以及构造析构顺序】
一.构造函数class 类名 { 类名 (形参表) : 初始化表 { 函数体; }};当该类的对象被创建时,相应类型的构造函数被自动执行。创建对象的同时提供构造实参表,与构造函数的形参匹配。1)构造函数可以重载2)缺省构造函数如果一个类中没有定义任何构造函数,那么系统就会自动为其提供一个无参构造函数,谓之缺省构造函数。缺省构造对于基本类型的成员变量不做原创 2015-06-05 13:24:39 · 709 阅读 · 0 评论 -
C++中const、volatile、mutable的用法
const修饰普通变量和指针const修饰变量,一般有两种写法:const TYPE value;TYPE const value;这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写,都是一个含义,即value值不可变。 例如:const int nValue;转载 2015-06-04 11:01:57 · 671 阅读 · 0 评论 -
C语言位运算符:与、或、异或、取反、左移和右移
C语言位运算符:与、或、异或、取反、左移和右移语言位运算符:与、或、异或、取反、左移和右移位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进制位的问题。C语言提供了6个位操作运算符。这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型。C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则转载 2015-06-04 10:57:07 · 697 阅读 · 0 评论 -
运算符*和指针以及前++、后++总结
*p++,由于++和*同优先级,结合方向自右而左,等价于*(p++)。*(p++)与*(++p)作用不同。若 p 的初值为 a,则*(p++)等价 a[0],*(++p)等价 a[1]。(*p)++表示 p 所指向的元素值加 1。原创 2015-06-04 10:43:42 · 1296 阅读 · 0 评论 -
des,d2des,d3des的区别
三重DES 因为确定一种新的加密法是否真的安全是极为困难的,而且DES的唯一密码学缺点,就是密钥长度相对比较短,所以人们并没有放弃使用DES,而是想出了一个解决其长度问题的方法,即采用三重DES。这种方法用两个密钥对明文进行三次加密,假设两个密钥是K1和K2,其算法的步骤如图5.9所示: 1. 用密钥K1进行DEA加密。 2. 用K2对步骤1的结果进行DES解密。原创 2016-02-17 17:27:45 · 3942 阅读 · 0 评论 -
struct和union计算方法
规则:1,对于union,对齐的大小是最大的基本元素的对齐大小;对象的大小必须是该基本元素大小的整数倍;2,对于struct,对齐的大小也是最大的基本元素的对齐大小,对象的大小需要考虑元素的对齐,并且需要是最大基本元素的整数倍;同时有#pragma pack修饰的情况,关于struct请详细参考另外一个帖子。3,这里所说的struct和union的对齐,是指其作为其他复杂对象中的元素的转载 2015-06-04 10:54:20 · 1102 阅读 · 0 评论 -
分别给出 BOOL,int,float,指针变量 与“零值”比较的 if 语句
试题 :分别给出 BOOL,int,float,指针变量 与“零值”比较的 if 语句(假设变量名为 var) 解答: BOOL 型变量:if(!var) int 型变量: if(var==0) float 型变量: const float EPSINON = 0.00001; if ((x >= - EPSINON) && (x 指针变原创 2015-11-04 15:51:12 · 3732 阅读 · 0 评论 -
数组以及数组作为参数所占内存问题
以 下 为 Windows NT 下 的 32 位 C++ 程 序 ,请 计算sizeof 的值void Func ( char str[100] ){sizeof( str ) = ?}void *p = malloc( 100 );sizeof ( p ) = ? 解答:sizeof( str ) = 4sizeof ( p ) = 4 剖析:原创 2015-11-04 15:57:02 · 3066 阅读 · 0 评论 -
组织数据结构的能力
将 WAV 文件格式定义为结构体 WAVEFORMAT:typedef struct tagWaveFormat{char cRiffFlag[4];UIN32 nFileLen;char cWaveFlag[4];char cFmtFlag[4];char cTransition[4];UIN16 nFormatTag ;UIN16 nChannels;U原创 2015-11-04 17:03:11 · 771 阅读 · 0 评论 -
C++【重载,覆盖,隐藏三者的区别】
重载与覆盖:成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual 关键字。“隐藏”是指派生类的函数屏蔽了与其同名的基类原创 2015-06-16 13:38:34 · 862 阅读 · 0 评论 -
指针函数与函数指针的区别
在学习过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y);首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,原创 2015-06-25 11:50:18 · 693 阅读 · 0 评论 -
关于指针的加减操作
原题:main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); }程序输出是什么。 解答: 程序输出: 2,5 分析: 这里主要是考查关于指针加减操作的理解。 对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1原创 2015-08-19 16:24:06 · 9269 阅读 · 0 评论 -
用static声明的函数和变量小结
static 声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。 2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。 A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度; B.若全局转载 2015-07-24 15:54:48 · 8424 阅读 · 1 评论 -
stat,lstat,fstat三者的区别
int stat(const char *path, struct stat *buf);int lstat(const char *path, struct stat *buf);int fstat(int filedes, struct stat *buf);聪明人一眼就能看出来fstat的第一个参数是和另外两个不一样的,对!fstat区别于另外两个系统调用的地方在于,fsta原创 2016-03-08 14:01:56 · 4654 阅读 · 0 评论 -
字节存储排序:大端和小端的判别及转换
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。其实大端也叫高尾端,小端也叫低尾端;这样记的话比较容易理解;字节排序按分为大端和小端,概念如下大端(big endian):低地址原创 2016-09-14 22:43:54 · 9655 阅读 · 1 评论 -
深入理解C语言(包含oop的思想,内存和管理,I/O的实现)
语言只是一种工具,任何语言之间都是相通的,一通则百通,关键是要理解语言背后的思想,理解其思想,任何语言,拿来用就行了。语言没有好坏之分,任何语言既然存在自然有它存在的价值。 在一个到处是OOP的年代,为何面向过程的C语言依然可以如此活跃?这主要得益于C语言本身的语言特性。C语言小巧灵活,而且还有一个直接与硬件打交道的指针的存在,所以它是嵌入式开发唯有的高级语言;正因为他的小巧灵活,我们可原创 2016-01-11 17:31:55 · 2568 阅读 · 0 评论 -
详解 C/C++中struct和typedef struct
今天在linux下使用gcc编译的时候忽然出现了【错误:‘s’的存储大小未知】其中s是结构体变量,然后就仔细观察错误原因,结果竟然是......现总结如下:1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的原创 2015-11-17 11:12:04 · 1915 阅读 · 0 评论 -
C++【显示类型转换】
显示类型转换 C:目标类型变量 = (目标类型)源类型变量; int n; char c; c = (char)n; C++:五种转换形式 1.C风格的另一种写法 目标类型变量 = 目标类型 (源类型变量); int n; char c; c = char (n); 2.静态类型转换:static_cast<目标类型> int n; char c; c = static_原创 2015-10-28 11:04:20 · 736 阅读 · 0 评论 -
C++【引用与指针】
引用 1.引用即别名 int a = 10; int& r = a; // r是a的一个别名 r = 20; cout << a << endl; // ? 20 2.引用必须初始化 int& r; // ERROR ! 3.引用一旦初始化,就不能再引用其它变量 int a = 10; int& r = a; int b = 20; r = b; // b -> a 4.引原创 2015-10-28 11:01:37 · 758 阅读 · 0 评论 -
C++【堆内存的动态分配与释放(new/delete)】
C语言分配动态内存常用函数:malloc/calloc/realloc/free C++语言用new/delete:详见memory.cpp 1.通过new运算符分配单个变量 数据类型* 指针变量 = new 数据类型(初值); int* p2 = new int;int* p3 = new int (100); 2.通过new运算符分配数组 int* p4 = new int[5]原创 2015-10-28 10:59:37 · 3303 阅读 · 0 评论 -
C++【函数(重载/缺省参数/哑元/内联)】
1.重载在同一个作用域中函数名相同但参数表不同的函数构成重载关系。1)C++是通过换名,即将参数表信息汇合到函数名中,实现重载。通过在函数声明前写上extern "C"显式地告知编译器对该函数用C的方式生成接口,即不做换名。当然不换名的函数无法实现重载。2)函数重载不仅和函数的定义有关,而且与函数调用的上下文有关,只要在同一个作用域中可见,且需要通过重载解析规则确定调用版本,即原创 2015-10-28 10:55:24 · 1338 阅读 · 0 评论 -
C++【基础常识】
第一个C++程序1.编译器:g++2.扩展名:.cpp/.cc/.cxx/.C3.头文件:C++的标准头文件都没有.h扩展名 C++对C兼容的头文件4.输入输出:cin/cout/cerr,>>/scanf (...) -> fscanf (stdin, ...)printf (...) -> fprintf (stdout, ...)5.名字空间原创 2015-10-28 10:52:00 · 683 阅读 · 0 评论 -
C++【类与访控属性】
学生 属性:姓名、年龄 行为:学习类就是通过对属性和行为的抽象,描述一组对象的语法结构。1.类的定义class 类名 {};如class Student {};2.通过成员变量表达属性class 类名 { 类型 成员变量名;};如class Student { string m_name; int m原创 2015-10-28 10:38:50 · 903 阅读 · 0 评论 -
C++【错误和异常的处理】
一、程序的错误1.编码错误:编译阶段2.设计错误:测试阶段3.环境错误:使用阶段4.应用错误:测试和使用阶段二、错误处理机制1.通过返回值处理错误当一个函数在执行过程中发生了某种错误,通过函数的返回值告诉函数调用者。malloc/fopen - 成功返回有效指针,失败返回NULL返回无效值表示失败返回0表示成功,返回-1表示失败1)优点:简单、避免崩溃、原创 2015-10-27 16:42:13 · 2050 阅读 · 0 评论 -
C++【多态】和【覆盖】
多态=虚函数+指针/引用关于多态: 形状:位置,绘制 矩形:宽度、高度,绘制 圆形:半径,绘制 Shape / \ Rect Circle 如果将基类中的某个成员函数声明为虚函数,那么其子类中与该函数具有相同原型的成员函数就也成为虚函数,并对基类中的版本构成覆盖(override)。通过一个指向子类对象的基类指针,或者引用子类对象的基类引用,调用这个虚函数时原创 2015-10-27 16:28:06 · 1217 阅读 · 0 评论 -
C++【拷贝构造】和【拷贝赋值】(实现自定义的string类)
拷贝构造的形式,何种情况会调用拷贝构造。 1.构造副本 2.以值的方式传参 3.以值的方式返回缺省的拷贝赋值只能实现浅拷贝,因此会带来对象与其副本之间的指针耦合问题,为了实现深拷贝,就需要自己定义拷贝赋值,以获得完整意义上的对象副本。 实现步骤: 1)防止自赋值 2)释放原内存 3)分配新内存 4)获得新数据 5)返回自引用练习:实现一个String类,可以通过C风格的字符串(指向原创 2015-10-27 14:10:46 · 2550 阅读 · 0 评论 -
C/C++中static和const关键字的作用总结
static 关键字至少有下列 n 个作用: (1)函数体内 static 变量的作用范围为该函数体,不同于auto 变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问; (3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用原创 2015-11-05 13:25:08 · 2257 阅读 · 0 评论