
L - C/C++
gyymen
一个人能走多远,不在于你的体力有多好和你是否有一双好的鞋子,而在于你的视野和你所选择的路。
展开
-
C/C++数组名与指针区别深层探索
1. 引言指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:“数组名就是指针”。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着“数组名就是指针”的误解。想必这种误解的根源在于国内某著名的C程序设计教程。如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,笔者就不甚欣慰了。借此文,笔原创 2010-06-24 14:29:00 · 316 阅读 · 0 评论 -
C++之作用域运算符::
C++使用::运算符搞定很多东西,其中最基本的一个用处就是用来决议多继承中的重名成员。::运算符的本质是:左操作数是一个scope,右操作数是这个scope内的名字,可以是 scope,class,member或者function,variable等等,从左操作数指定的scope中找到有操作数这个实体。看起来非常优雅,不是么?可是,它有好几个缺陷。一、现实的常见的缺陷。分散在代码中,一旦改变会引起原创 2016-12-09 08:33:32 · 11175 阅读 · 1 评论 -
C++模板特化和偏特化
摘要:本文通过例子介绍了在 C++标准库中广泛使用的模板特化和偏特化,并指出了模板特化和偏特化的定义规则和应用规则。关键词:模板、特化、偏特化1.引言C++ 中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,这一点在STL中有着充分的体现。目前,STL在 C++社区中得到了广泛的关注、应用和研究。理解和掌握模板是学习、应用和研究以及扩充STL的基础。而S原创 2016-12-09 08:33:15 · 383 阅读 · 0 评论 -
C++中的继承
先看一下下面的例子:// File1:CBase.h#include using namespace std;class CBase{ public: CBase(void){}; virtual ~CBase(void){};//如果一个类被用来作为基类的时候,最好把析构函数写成虚函数。这样做是为了当用 一个基类原创 2016-12-09 08:33:12 · 392 阅读 · 0 评论 -
C++中string做函数传递参数的危险问题
许多人会遇到这样的问题,自己做的程序要调用别人的函数、类什么的(比如数据库连接函数Connect(char*,char*)),但别人的函数参数用的是char*形式的,而我们知道,c_str()、data()返回的字符数组由该字符串拥有,所以是一种const char*,要想作为上面提及的函数的参数,还必须拷贝到一个char*,而我们的原则是能不使用C字符串就不使用。那么,这时候我们的处理方式是:如原创 2016-12-09 08:33:10 · 14994 阅读 · 0 评论 -
VC中与字符串相关的宏 _T、TEXT,_TEXT、L 的作用
一、 在字符串前加一个L作用:如L"我的字符串" 表示将的字符串,就是每个字符占用两个字节。strlen("asd") =3;strlen(L"asd") =6;二、_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式如果你定义了UNICODE,那么_T宏会把字符串前面加一个L。这时 _T("ABCD"原创 2016-12-09 08:33:07 · 319 阅读 · 0 评论 -
C中函数指针的作用
项目中用到了很多封装在struct中的函数指针,以前在MFC里面经常用到则个作为回调函数,还以为是微软设计的特色呢。在网上查了一下它的用法,做个总结。 1)提供调用的灵活性。设计好了一个函数框架,但是设计初期并不知道自己的函数会被如何使用。比如C的”stdlib”中声明的qsort函数,用来对数值进行排序。显然,顺序还是降序,元素谁大谁小这些问题,库程序员在编写qsort的时候不可能决定。这些问题原创 2016-12-09 08:32:50 · 392 阅读 · 0 评论 -
typedef和define具体的详细区别
1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如:#define PI 3.1415926程序中的:area=PI*r*r 会替换为3.1415926*r*r如果你把#define语句中的数字9 写成字母g 预处理也照样带入。2)typedef是在编译时处理的。它在自己的作用域内给一原创 2016-12-09 08:32:47 · 267 阅读 · 0 评论 -
什么是预编译?
处理#开头的指令,比如拷贝#include包含的文件代码,#define宏定义的替换,条件编译等 就是为编译做的预备工作的阶段 主要处理#开始的预编译指令 预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。常见的预编译指令有: (1)#include 指令 该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用 注意:而用""把头文件名扩起,其原创 2016-12-09 08:32:44 · 673 阅读 · 0 评论 -
C++中得到基本数据类型的取值范围
欲知道某个类别的最大值和最小值, 可查询标准程序库中 numeric_limit class.#includeint max_int = numeric_limit::max();double min_dbl = numeric_limit::min();原创 2016-12-09 08:33:48 · 686 阅读 · 1 评论 -
C/C++宏的特殊符号
在C/C++中,宏定义是由define完成的,define中有三个特殊的符号值得我们注意:1. #:在宏展开的时候会将#后面的参数替换成字符串,如: #define p(exp) printf(#exp); 调用p(asdfsadf)的时候会将#exp换成"asdfsadf"2. ##:将前后两个的单词拼接在一起。例如《The C Programming Language》中的例子: #d原创 2016-12-09 08:33:51 · 3004 阅读 · 0 评论 -
防止头文件被多次包含的处理方法
1、为什么会出现多次包含同一个头文件呢?最常见的原因是许多包含文件自身包含了其他文件,因此可能显式地包含其他文件已经包含的文件。2、为什么这会成为问题?因为头文件中的某些语句在一个文件中只能出现一次,比如结构类型的声明。标准C头文件使用#ifndef技术来避免多次包含。示例如下:/* things.h */#ifndef THINGS_H_#define THINGS_H_转载 2009-12-08 12:13:00 · 1313 阅读 · 0 评论 -
C++内存管理
内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能。下面就我的了解做个大概介绍。1、内存分配方式 内存分配方式有三种: (1)从静态原创 2010-06-21 09:28:00 · 291 阅读 · 0 评论 -
学习C++从入门到精通的的十本最经典书籍
1、《C++Primer》有“C++的百科全书”,C++程序员人手必备。对语法、语义的描述非常细致和严谨,适合有一定经验的C、C++程序员作为工具书和理论指导书使用,但由于其有一定深度,而没有进阶顺序的章节安排,所以不适合初学者做为教材使用,价格略高。难度:★★☆质量:★★★★★广度:★★★★★深度:★★★★性价:★★★☆ 2、《C++Primer Plus》初学C++不错的书,覆盖面较全,章节安转载 2009-12-08 11:35:00 · 680 阅读 · 1 评论 -
C++库大全
基础类1、 Dinkumware C++ Library参考站点:http://www.dinkumware.comP.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobbs程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C+ +的产品中采用Dinkumware的库。2转载 2009-12-08 11:45:00 · 756 阅读 · 0 评论 -
C++内存分配各种方法之间的区别
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由原创 2009-12-08 11:46:00 · 577 阅读 · 0 评论 -
c++中“箭头(->)”和“点号(.)”操作符的区别
首先介绍一下C++中的结构。对于一个结构:struct MyStruct{ int member_a;};如果有个变量MyStruct s,那么使用其中的成员元素时可以用:s.member_a = 1;如果采用指针方法访问,比如MyStruct * ps,那么同样的访问就必须使用如下形式:(*ps).member_a = 1;或者ps->m原创 2009-12-08 11:48:00 · 37971 阅读 · 6 评论 -
C++指针和引用的区别
很多朋友在学习C++时,总是把指针和引用混淆,今天我们一起做做比较。1、非空区别。指针是指向对象的地址,而引用是对象的别名,在任何情况下都不能使用指向空值的引用,一个引用必须总是指向某些对象。如果你想使用一个变量让他指向一个对象并且该变量可能不指向任何变量,那么你应该讲变量设置为指针。想反,如果你想声明一个变量让他肯定指向一个对象,并且该变量不能为空,这时你就可以把变量声明成引用。不存在指向空原创 2009-12-08 12:08:00 · 476 阅读 · 0 评论 -
C++默认参数
<br />一、默认参数<br />在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。<br />默认参数的语法与使用:<br /> <br />(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;<br />(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。<br />注意:<br />(1)默认参数只可在函数声明中设定一次。只有在无函数声明时,才可以在函数定义中设定。<br />(2)默认参数定义的顺序为自右到左。即如果一个参数设原创 2011-03-28 17:50:00 · 365 阅读 · 0 评论 -
近堆和远堆
应该是near 和 far指针的问题。产生原因是这样的:如果动态创建的数据量比较大,用一个数据段(一般是64K,此时段指针不变,偏移量指针在16bit内变化)放不下的时候,需要重新开辟一个数据段供存放更多的数据,此时称原来的堆部分为近堆,改变段地址后的新的数据段所在的堆部分称为远堆。原创 2016-12-09 08:32:41 · 1301 阅读 · 0 评论 -
指向指针的指针
在做一个文本处理程序的时候,有这样一个问题:什么样的数据结构适合于按行存储文本? 首先,我们来分析文本的特点,文本的主要特征是具有很强的动态性,一行文本的字符个数或多或少不确定,整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然限制多多,缺乏灵活性。这种场合,使用指向指针的指针有很大的优越性。 现实中我们尝试用动态二维数组(本质就是指向指针的指针)来解决此问题原创 2016-12-09 08:32:38 · 324 阅读 · 0 评论 -
C++拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include iostream>using namespace std;class CExample {private: int a;public: CExample(int b)原创 2016-12-09 08:32:27 · 334 阅读 · 0 评论 -
C++格式化输出
按有效位输出是 setprecision,按小数位数输出也是setprecision,但到底是谁取决于fixed。cout cout 测试代码:#include #include using namespace std;int main( void ){ const double value = 12.3456789; cout cout cout cout原创 2016-12-09 08:31:23 · 357 阅读 · 0 评论 -
C语言运算符优先级顺口溜
醋坛酸味灌,味落跳福豆共44个运算符醋-初等,4个: ( ) [ ] -> 指向结构体成员 . 结构体成员坛-单目,9个: ! ~ ++ -- -负号 (类型) *指针 &取地址 sizeof长度酸-算术,5个: * / % + -减味-位移,2个: >灌-关系,6个: >= == 等于 != 不等于味-位逻,3个: & 按位与 ^ 按位异或 | 按位或落-逻辑,2个: && 逻辑与 || 逻辑原创 2016-12-09 08:31:20 · 2002 阅读 · 0 评论 -
动态二维数组的分配与释放
两种方法:1、先定义一个一维数组的类型,然后再用该类型定义一个一维数组(实际上已经成为二维的),相当于递归定义: typedef int array[COL]; //使用typedef定义一个具有COL个元素的数组类型 array *a; //定义二维数组,与一维数组相同 a=new array[row];原创 2016-12-09 08:31:14 · 943 阅读 · 0 评论 -
Printf和Scan函数的使用方法
一、printf()函数是格式化输出函数, 一般用于向标准输出设备按规定格式输出信息。在编写程序时经常会用到此函数。printf()函数的调用格式为: printf("", );其中格式化字符串包括两部分内容: 一部分是正常字符, 这些字符将按原 样输出; 另一部分是格式化规定字符, 以"%"开始, 后跟一个或几个规定字符, 用来确定输出内容格式。参量表是需要输出的一系列参数, 其个数原创 2016-12-09 08:31:11 · 4724 阅读 · 0 评论 -
C/C++调用Delphi制作的dll时发现的一些问题
做了一个网络业务逻辑实体,是用C++编写的dll,内部有一个全局的业务实体,外部准备用Delphi编写的界面程序来控制并显示状态...... 1. C++的dll中不能用C++风格的导出方式:_declspec(dllexport)来导出函数,要用C风格的导出方式:extern "C" _declspec(dllexport),否则Delphi在加载C++的dll时报错:无法定位函数xxxFun(原创 2016-12-09 08:31:08 · 2939 阅读 · 1 评论 -
格式化输入输出浮点数据的细微问题(C标准:printf,scanf)
刚开始学C语言的时候,看到用scanf输入浮点数据的对应字符串如下:float : %fdouble : %lf而printf输出的时候却都是统一的:float / double : %f你也许曾经跟我一样,用%lf输出过double,结果是正常的,因为%lf直接被当作了%f了。但是这时候问题就来了,问题1.C语言也算是强类型的语言,两种不同类型怎么能统一到同一种输出上呢?问题2.既然输出都可以统原创 2016-12-09 08:30:57 · 2816 阅读 · 0 评论 -
人与继承的C++实现
如果上帝是程序员,我们每个人不用说了,肯定是人的每个实例,但是上帝会把人定义为接口呢还是类?究竟我们是继承了人这个基类,还是实现了人的接口?人妖这个类怎么就能变过来了?双胞胎怎么生成的?连体婴儿呢? 我的看法是:人是类,而不是接口,有些东西人是天生就有的,因此人应该是类。 【人妖】属于保护继承,隐藏了一些细节,同时也覆盖了某些函数。 既然是protected继承,因此你不能直接原创 2016-12-09 08:30:37 · 317 阅读 · 0 评论 -
C/C++中怎样产生随机数
C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。 (1) 如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。例如:#incl原创 2016-12-09 08:30:28 · 329 阅读 · 0 评论 -
指针数组和数组指针
指针数组,故名思义,就是指针的数组,数组的元素是指针; 数组指针,同样,就是直想数组的指针。 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是int型的指针。 int (*p)[2]; 声明了一个指针, 指向了一个有两个int元素的数组。 其实这两种写法主要是因为运算符的优先级, 因为[]的优先级比*高。所原创 2016-12-09 08:31:26 · 222 阅读 · 0 评论 -
C++位操作介绍
C++位操作包括两种:传统的C语言方式的位操作和C++中利用bitset容器的位操作 一、传统的C方式位操作: 1.基本操作: 使用一个unsigned int变量来作为位容器。 2.操作符: | 按位或操作符:result=exp1|exp2;当exp1和exp2中对应位中至少有一个为1时,result中对应位为1,原创 2016-12-09 08:31:29 · 275 阅读 · 0 评论 -
c++_cast_最完整最详细的解释
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。static原创 2016-12-09 08:32:00 · 8564 阅读 · 0 评论 -
C++虚函数和多态
1、什么是虚函数和多态虚函数是在类中被声明为virtual的成员函数,当编译器看到通过指针或引用调用此类函数时,对其执行晚绑定,即通过指针(或引用)指向的类的类型信息来决定该函数是哪个类的。通常此类指针或引用都声明为基类的,它可以指向基类或派生类的对象。多态指同一个方法根据其所属的不同对象可以有不同的行为(根据自己理解,不知这么说是否严谨)。举个例子说明虚函数、多态、早绑定和晚绑定:李氏两兄妹(哥原创 2016-12-09 08:31:52 · 333 阅读 · 0 评论 -
C++学习笔记
1、类的保护区域(protected)的数据成员和函数成员,只提供给该类的派生类访问。2、类的私有区域的数据成员和函数成员,只能供该类自己和该类的友元类使用。3、"无论发送消息的对象属于什么类,它们均发送具有同一形式的消息,对消息的处理方式可能随接手消息的对象而变"的处理方式被称为多态性。原创 2016-12-09 08:31:49 · 270 阅读 · 0 评论 -
C/C++头文件一览
传统 C/C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include //数据流输入/输出#include //定义各种数据类型最值常量#include //定原创 2016-12-09 08:31:46 · 305 阅读 · 0 评论 -
C中常用的调试方法、DLL的调试
C中常用的调试方法 调试的最常用的方法,假如我们怀疑一个整形变量x有问题的话,可以:1, CString str;str.Format(“%d”,x);//和printf非常相似MessageBox(str);优点:点确定后程序才会继续运行。缺点:如果次数太多,过于浪费时间和键盘。2,Ctrl+F10运行到光标处,在Watch窗口中name项输入x,,后面会显示值。 优点:简单,可以查看所有的值原创 2016-12-09 08:31:43 · 1500 阅读 · 0 评论 -
匈牙利命名法
匈牙利命名法是一种编程时的命名规范。基本原则是:变量名=属性+类型+对象描述,其中每一对象的名称都要求有明确含义,可以取对象名字全称或名字的一部分。命名要基于容易记忆容易理解的原则。保证名字的连贯性是非常重要的。 举例来说,表单的名称为form,那么在匈牙利命名法中可以简写为frm,则当表单变量名称为 Switchboard时,变量全称应该为 frmSwitchboard。这样可以很原创 2016-12-09 08:31:37 · 540 阅读 · 0 评论 -
头文件与cpp文件为什么要分开写
最表面的机制是: 头文件是程序的界面(是代码界面),提供给程序员以 类、模版、函数等一系列的声明,让程序员知道应该怎么调用里面的“东西”。 从动态链接库的角度看: 头文件提供界面,使得程序员在需要加载一个库函数的时候(这里也仅仅是举简单的例子)查看头文件就知道怎么加载这个动态库内部的函数。 从软件的扩展来说: 将头文件作为界面原创 2016-12-09 08:31:35 · 856 阅读 · 0 评论 -
C++模板类的声明、定义和使用
说明: 1. 将C++模板类的声明和定义都放在一个文件,如.h或.cpp文件中,使用的时候加入#include "模板类文件名.h(或.cpp)“即可。 2. 将C++模板类的声明和定义分别放在.h和.cpp文件中且在.cpp文件中包含 #include ".h"。不过在使用时,会因为不同的开发环境而有所不同: a. 在集成开发环境code::bl原创 2016-12-09 08:31:32 · 1563 阅读 · 0 评论