C/C++学习
文章平均质量分 71
肥萝卜使大力
这个作者很懒,什么都没留下…
展开
-
gcc总结【基本用法】【选项】【动静态库】
<!--@page {margin:2cm}p {margin-bottom:0.21cm; direction:ltr; color:#000000; text-align:justify; widows:0; orphans:0}p.western {font-family:"Times New Roman",serif; font-size:1转载 2012-07-29 19:23:32 · 4035 阅读 · 0 评论 -
C++沉思录读书笔记(31章)- C++对复杂性的哲学
世界正变得越来越复杂,对于工业产品,现代化的生产流程将产品的复杂度转移到了组件之中,但是这些组件的生产过程的复杂度也越来越高,我们通过工艺技术去消弭复杂度的影响,是抽象使得这种取代称为可能,抽象让我们能够以相同的方式去对待彼此类似的东西,同时又能注意到它们的差异,抽象是处理复杂世界最有力的工具C++的复杂性大部分是由于为了提供某种手段来进行问题抽象的缘故,C++的抽象机制使得在别的的语言中原创 2011-11-11 23:54:26 · 858 阅读 · 0 评论 -
一个隐式类型转换引起的重载函数二义性错误
介绍因为隐式类型转换而引起的一个非常隐晦的错误下述代码的目的是设计一个简单的类A,希望A的对象在标准输出和文件输出时的表现不同#include #include using namespace std;class A{public: int a, b; A(int n1 = 0, int n2 = 0): a(n1),b(n2) {} // 加上expl原创 2011-11-11 15:57:40 · 1839 阅读 · 0 评论 -
C++沉思录读书笔记(29章)- 应用器,操纵器和函数对象
我们经常在程序中看见诸如int n; cout对于coutostream& operator<<(ostream& file, const Complex& z){ file << "(" << z.re() << "," << z.im() << ")"; return file;} 对于cout 假设flush函数的定义如下:ostream& f原创 2011-11-10 22:45:00 · 1125 阅读 · 0 评论 -
C++沉思录读书笔记(30章)- 一个IO库的两种设计
假设需要对自定义的String类进行各种类型的IO设计一,使用继承进行抽象,代码如下class Write{public: virtual ~Write(); virtual void send(const char*, int) = 0;};Write& operator<<(Write& w, const String& s){ for(int i = 0; i<原创 2011-11-11 11:30:28 · 787 阅读 · 0 评论 -
C++沉思录读书笔记(21,22章)- 函数对象存在的意义以及自定义能应用bind1st(bind2nd)的函数对象模板
函数对象存在的意义 假设有一个类型为vector的对象,我们想找出其中第一个大于100的元素对应的迭代器,显然我们可以使用如下方法find_if(v.begin(), v.end(), greater100); 其中greater100是一个函数指针,这个指针对应的函数定义如下bool greater100(int n){ return n原创 2011-11-09 15:45:17 · 1291 阅读 · 0 评论 -
设计只能在堆或者栈上创建的类
看到了CSDN一篇帖子在讨论这个问题,某牛给出了回答,于是加以整理了一下设计只能在堆上分配的类方法:将类的构造函数或者析构函数设置为私有,迫使类对象在栈的构造时编译出错#include using namespace std;class OnlyHeap{public: OnlyHeap() { cout<<"construct"<<endl; }原创 2011-10-25 15:50:07 · 1251 阅读 · 0 评论 -
C++沉思录读书笔记(27章)- 设计自己跟踪自己的类
这篇文章的目的是设计提供有关函数执行和类操作调试信息的类1.一个简单函数跟踪类的设计class Trace //跟踪类{public: Trace(const char* p, const char* q): bye(q) { cout << p; } ~Trace() { cout << bye; }private: const char* bye;};原创 2011-11-10 17:25:35 · 989 阅读 · 0 评论 -
C++沉思录读书笔记(25,26章)- 库设计与语言设计
一C++中的一个更为重要的思想是用户自定义类型可以很容易地当作内建类型使用。通过定义新类型,用户可以为了他们自己的目的来定制语言。这种强大的工具如果被错误的使用,便会十分危险。实际上,设计类库和设计编程语言是相似的,而且应该给予高度的重视。 注:原地址在http://archive.cnblogs.com/a/1692743/ 本文对原内容的错误进行了修改,并增加了新的内容原创 2011-11-09 21:36:56 · 867 阅读 · 0 评论 -
C++沉思录读书笔记(20章)- 通过迭代器配接器提高泛型算法的通用性
此次将通过一个例子来说明迭代器配接器的作用,具体来说,使用迭代器配解器也可以扩展泛型算法的通用性迭代器配接器,就是把迭代器作为参数并转化为其他迭代器的模板口头的空谈太过于抽象而言而无实,讲很多也未必能理解,软件工程师看代码的能力一般比看中文的能力强,通过阅读代码进行理解可靠得多,所以应该避免过多的口舌我们的作为示范的泛型算法模板如下template T find(原创 2011-11-08 21:14:27 · 1364 阅读 · 2 评论 -
C++沉思录读书笔记(23,24章)- 设计一个针对C接口的C++包装类
真理:使用C接口我们必须遵守它的一些隐藏约定,如果不遵守这些约定的话在程序运行时可能会出现奇怪的情况而导致失败,我们可以使用C++的数据抽象概念对C接口进行改进;对于C++而言,如果对某个类对象的所有单个方法的调用都会让对象置于一种合理的状态,那么对象的状态就能始终保持合理这个例子针对C语言检查文件系统目录的一个例程集C语言遍历某个目录下的文件名的代码如下:#include原创 2011-11-09 17:37:00 · 2489 阅读 · 2 评论 -
C++沉思录读书笔记(19章)- 使用泛型迭代器将泛型算法应用到不同的场合
这回将介绍,如何使用不同的迭代器,将一个泛型算法应用到不同的场合我将使用泛型算法Copy为例子,利用不同的迭代器去应用这个算法,此算法代码如下:template Out Copy(In start, In end, Out dest) //模板copy在名称空间std中已经包含,为与标准版本区别而命名为Copy{ while(start != end) *dest++ =原创 2011-11-08 17:37:17 · 1001 阅读 · 0 评论 -
C++沉思录读书笔记(18章)- 确定一个泛型算法能支持的数据结构的方法
泛型算法要求对所操作的数据结构的细节信息,要有最小的限定。理想情况是对数据结构的细节信息没有任何限定,但这是不可能的如何确定一个泛型算法的应用范围呢?分析如下:上一回我们得到了一个泛型算法template T* find(S s, S b, const T& x){ while (s!=b && *s!=x) ++s; return s;} 这个原创 2011-11-08 11:31:04 · 1053 阅读 · 0 评论 -
C++沉思录读书笔记(17章)-见识泛型算法的威力
在这回的学习中,我们能体会到泛型算法的威力,这是通过模板(抽象)实现的泛型算法是一种用对其所用的数据结构进行尽可能少的假设的方法表达的算法,模板使得泛型(genericity)更为容易首先来看一个简单的例子,假设我们想找整形数组中第一个等于某个给定值的元素,代码很简单,如下:const int* find(const int* array, int n, int x)原创 2011-11-07 22:00:48 · 1481 阅读 · 2 评论 -
关于“非基本类型需慎用memcpy函数”的分析
假设我们要将一个元素类型为T的对象数组复制到另外一个数组中,我可以很轻松写出如下代码T sour[N];T dest[N];int i;for(i = 0; i < N; i++) dest[i] = sour[i];在C和C++中,上述代码都可以生效然而,C程序员可能更喜欢用下面的方案T sour[N];T dest[N];int i;memcpy(dest原创 2011-11-12 21:30:09 · 2394 阅读 · 2 评论 -
析构函数、赋值操作符与复制构造函数关系的分析
类设计三法则:如果类需要显式定义析构函数,则它也需要赋值操作符和复制构造函数关于这个法则需要注意两点:1.如果类成员变量中有指向动态分配的内存,则一定需要显式定义析构函数,从而需要定义赋值操作符和复制构造函数2.如果一个类需要提供显式的复制和赋值操作定义,则将这个类的对象作为数据成员的类不需要额外提供复制和赋值操作定义,也就是说一个类缺省的复制和赋值操作递归的依赖于底层类的成员原创 2011-11-10 15:46:55 · 1068 阅读 · 0 评论 -
GNU C和C99标准中的可变参数宏(variadic macros)
用可变参数宏(variadic macros)传递可变参数表你可能很熟悉在函数中使用可变参数表,如:void printf(const char* format, …);直到最近,可变参数表还是只能应用在真正的函数中,不能使用在宏中。C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。可变参数宏转载 2011-12-10 15:46:21 · 2532 阅读 · 0 评论 -
有关stdint.h 文件
Google C++编程规范的P25页有如下叙述: 定义了 int16_t 、 uint32_t 、 int64_t 等整型,在需要确定大小的整型时可以使用它们代替 short 、 unsigned long long 等,在 C 整型中,只使用 int 。适当情况下,推 荐使用标准类型如 size_t 和 ptrdiff_t 。最常使用的是,对整数来说,通常不会用到太大,如循环计原创 2012-04-17 19:43:15 · 31869 阅读 · 5 评论 -
深入理解C语言
导读:Dennis Ritchie过世了,他发明了C语言,一个影响深远并彻底改变世界的计算机语言。一门经历40多年的到今天还长盛不训的语言,今天很多语言都受到C的影响,C++,Java,C#,Perl,PHP,Javascript等等。但是,你对C了解吗?相信你看过本站的《C语言的谜题》还有《谁说C语言很简单?》。这里,我再写一篇关于深入理解C语言的文章,一方面是缅怀Dennis,另一方面是告诉大转载 2012-04-28 22:31:48 · 730 阅读 · 0 评论 -
什么是pod类型?
转自:http://www.diybl.com/course/3_program/c++/cppjs/20091024/180119.html最早看到POD(plain old data)类型,是在imperfect c++里。我觉得这是一本把我带到c++世界里的一本很重要的书。书里是这样解释POD的:1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这转载 2012-04-13 21:40:38 · 2452 阅读 · 0 评论 -
“定义为指针,外部以数组形式引用”和“定义为数组,外部以指针形式引用”会发生什么?
思科的一道面试题如下:不要用编译器 用1分钟事件思考下源文件A:int a[10];int *b=a;源文件B:extern int *a;extern int b[];int x,y;...x=a[3];y=b[3];解释执行两条赋值语句时会发生什么?ChinaUnix里面有一高人的解释如下:这个问题不会产生编原创 2012-04-11 17:09:15 · 2311 阅读 · 0 评论 -
VS2008下编写调试dll的一个实例
VS2008下编写调试dll的一个实例(参考msdn)演练:创建和使用动态链接库在本演练中,您将创建一个动态链接库 (DLL),其中包含可供其他应用程序使用的有用例程。使用 DLL 是一种重用代码的绝佳方式。您不必在自己创建的每个程序中重新实现这些例程,而只需对这些例程编写一次,然后从需要该功能的应用程序引用它们即可。本演练使用本机 C++。有关使用本机 C++ 创建静转载 2012-03-22 15:48:01 · 1482 阅读 · 0 评论 -
C++针对一个类的子类进行特化
copy自http://www.cppblog.com/qingant/archive/2012/03/21/168529.html在水木C++版,有人提出如何针对"基类是xx类的类型"进行特化。这里面的关键 是理解这样几件事情: 1. 模板的特化 2. 如何在编译期判断xx是xx的基类 我们使用了这样一个type traits:转载 2012-03-22 09:56:05 · 918 阅读 · 0 评论 -
神器之开源C++库
开源C++库必须具有以下特点:必须是成熟的产品、跨平台的产品、相对通用的库。 一、通用标准类 STL:C++标准模板库,呵呵,它也是开源的嘛。 boost:C++准标准库,它是强大地,江湖称之"千锤百炼"。 deelx (轻量级的正则表达式解析类库,国产),boost里有强大的正则表达式解析库,但如果你只想要一个表达式解析,不想要拖上庞大的boost转载 2012-03-14 15:55:06 · 1213 阅读 · 0 评论 -
详解#pragma 指令
在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。 其格式一般为: #pragma para 其中par转载 2012-03-28 16:33:28 · 510 阅读 · 0 评论 -
boost的编译方法
许多新人对于编译BOOST感到无从下手,甚至因此而放弃使用BOOST,那真的太可惜了,下面我把一些常用的BOOST编译方法贴于此,同时也作为自己的笔记。 首先下载bjam.exe,复制到 $BOOST$ 目录下。或者自己生成bjam,打开Visual Studio 2008 命令提示窗口$BOOST$\tools\jam\src,执行 build.bat 会在$BOOST$\tools\jam转载 2012-03-27 10:22:53 · 964 阅读 · 0 评论 -
探秘C++单元测试框架丛林
我曾经在相当一段时间内想搞清楚的主题是,如何在游戏开发中应用测试驱动开发(TDD)。每当我和朋友们在会议上或者邮件列表中谈论此主题时,每个人都表示出了极大的好奇心,并且立刻想了解更多。我发誓,我可以很快搞清楚这个问题的。与此同时,我面临着这样的情况:我必须选择一个单元测试框架,以便我的团队应用于工作中。因此,在谈论如何游戏中使用测试驱动开发或者单元测试框架的价值又或者其他任何类似的主题之前,还转载 2012-03-27 20:54:06 · 751 阅读 · 0 评论 -
详解sizeof操作符
一、sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。二、sizeof的使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) 如sizeof(int)。 2、用于变量原创 2012-02-16 09:17:44 · 1067 阅读 · 0 评论 -
终端对非打印字符的显示方式的有趣例子
有如下代码:#include #include using namespace std;int main(int argc, char** argv){ char buffer[32] = {0}; buffer[0] = 0; buffer[1] = 'E'; buffer[2] = 'L'; buffer[3] = 'L'; buffer[4] = 'O'; stri原创 2012-01-04 14:38:12 · 1424 阅读 · 0 评论 -
源字符集与执行字符集之间的区别
两类字符 在C语言中,字符(character)这个术语具有两个层次上的含义:书写源程序的字符和程序处理的字符。 例如,在下面的源程序中“""”之内的“你”、“好”、“,”、“C”、“!”、“\n”就属于程序要处理的字符。#include int main(void){ printf("你好,C!\n"); return 0;} 该源程序中的其他字符则属于书写源程序的字转载 2012-01-09 18:54:28 · 4925 阅读 · 1 评论 -
C++沉思录读书笔记(9,10章)-感想
看第九章,第十章看得想死,领会了一些设计精神,但无法用语言表达,此两章还需要继续研究。教训:复杂的设计不能光看,用笔将其互相的关系画出来才清晰的将其理清。感悟:OOP设计是一门艺术,需要观摩大师指点,需要自己一步步实践。原创 2011-11-02 16:49:47 · 978 阅读 · 1 评论 -
C++沉思录读书笔记(13、14章)-简单容器类的改进
上一回设计的容器类,用户能够轻易的获得指向Vector内部的指针,这种关系暴露了类内部的实现机制,下面加以改进代码如下:#include using namespace std;template class Vector{ private: T* data; unsigned sz;原创 2011-11-07 11:41:00 · 1329 阅读 · 0 评论 -
C++沉思录读书笔记(15,16章)-将模板应用于接口
15章没看16章的精华如下:模板的经典用途1.建立容器类2.描述一个或一组程序的接口对于1,前面已经讨论过了,对于2,16章有一个经典的求和函数例子。这章主要介绍了如何对一个函数进行抽象,对函数进行抽象,也就是将函数它所“知道”的一些细节特征分离出函数,让它只考虑宏观流程注:本书出版时间很早,作者太过执着与运行效率,甚至计较与动态绑定带来的效率损失,这是原创 2011-11-07 17:02:04 · 708 阅读 · 0 评论 -
一个计时器的实现
直接上代码定义头文件://: C09:Cpptime.h// From Thinking in C++, 2nd Edition// Available at http://www.BruceEckel.com// (c) Bruce Eckel 2000// Copyright notice in Copyright.txt// A simple time class#ifn原创 2011-11-18 22:37:14 · 675 阅读 · 0 评论 -
C++沉思录读书笔记(4章)-限定用户只能读而不能写类数据成员的方法
限定用户只能读而不能写类数据成员的方法方法1:可以通过使用常引用,如下所示class Vector{public:const int & length;//使用构造函数将length绑定到true_length上//...private:int true_length;};方法2:通常还是使用如下方式class Vector{public:i原创 2011-10-23 19:58:52 · 1064 阅读 · 0 评论 -
C++沉思录读书笔记(7章)-句柄:第二部分
上一回讨论的句柄技术有一个明显的缺点:为了将句柄捆绑到类T的对象上,必须要新定义一个具有类型为T的成员对象的新类。这个毛病相当麻烦,如果想新设计一个类的句柄类,就需要新定义两个类。C++之父提到过一种定义句柄类的技术可以弥补这一个缺点,主要思想就是将引用技术从数据中分离出来,把引用计数放到句柄类自己的对象之中。示例代码如下所示:#include using nam原创 2011-10-30 22:12:28 · 875 阅读 · 0 评论 -
集合初始化需要注意的一个问题
集合就是多个事物聚集在一起的总体,集合包括数组、结构体、类对于内部类型数组,我们可以这样定义int a[5] = {1,2,3,4,5};int b[5] = {0};int c[] = {1,2,3,4,5};对于一个结构体,我们也可以使用{}初始方式,如下struct X{ int i; float f;};X x1 = {1,1.1};X原创 2011-11-17 22:09:36 · 909 阅读 · 0 评论 -
句柄类的应用中减少重复编译的方法
我们知道,当一个源文件所依赖的头文件被修改时,这个源文件需要被重新编译(易碎的基类问题),为了能讲述我将说明的这个方法,我们先来看看一个简单的例子,其代码如下://head.hstruct A{ int i;};class B{ A* a;public: B(int n = 0); void show(); ~B();};//head.cpp#include "he原创 2011-11-16 22:44:06 · 1111 阅读 · 0 评论 -
探索智能指针
代码如下,不过这个智能指针有个缺陷,就是只能指向在堆中创建的对象,加以修改后可以改成只能指向在栈中创建的对象,但是无法兼顾两种情况(如果要兼顾两种情况,则智能指针只能指向对象的新建副本,这又失去了指针原有的含义,so...)#include using namespace std;class Object//能被智能指针所指的类{public: void ShowAddress原创 2011-10-26 20:42:23 · 657 阅读 · 0 评论 -
java程序设计与问题解决(基础篇)-读书笔记-2
Java语言的标识符中不能包含有. * -等非法字符 Java基本类型包括byte short int long float double char boolean其中byte占用一个字节,char占用两个字节(Unicode字符),其他与C语言类似 实现键盘输入操作需要使用Scanner类,需要import java.util.*; 浮点常量较为复杂的记法通常被称为e原创 2011-10-26 16:49:55 · 750 阅读 · 0 评论