
C++(不发表)
文章平均质量分 54
MJN
programming and sharing.
展开
-
函数指针与指针函数
<br />1、指针函数:是一个函数,返回类型为指针类型<br />float *fp(); <br />以上代码,()的优先级高于*,等价于<br />float *(fp()); <br />fp是一个函数,该函数的返回值类型为指向浮点数的指针。<br /> <br />2、函数指针:是一个指针,指向一个函数。<br />float (*fp)(); <br />调用以上函数:<br />(*fp)(); <br />ANSI C标准允许将上式简写为(但要记住这种写法只是一种简写形式):<br />fp原创 2010-09-12 11:11:00 · 646 阅读 · 0 评论 -
《The C++ Programming Language, special edition》第6章6.6节中的一道有趣习题ch6.6-15
题目内容如下(此题目在原书的第141页):15. (*1.5) What does the following example do?void send(int* to, int* from, int count) // Duff’s device. Helpful comment deliberately deleted.{ int n = (count+7)/8; s原创 2012-10-05 03:15:56 · 1730 阅读 · 0 评论 -
使用memset将指针的值置0
最近在某个系统中看到一段古怪的代码, 我更改代码的变量名称, 大致意思如下:void f(const char* p) { if (p == NULL) { memset(&p, 0, sizeof(p)); }}void g() { char* p = NULL; f(p);}函数f中的第二行代码: memset(&p, 0, sizeof(p));原创 2013-02-16 22:50:51 · 4940 阅读 · 0 评论 -
"整数相加溢出"引出的思考
前段时间在修复某系统的bug时, 发现一位同事在代码中加入了类似如下的语句:int a = 0;int b = 0;/*some codes*/if ( a + b <= 0) { /*some codes: invalid a or b*/}同事解释说: 用来判断溢出. 听了解释后, 我点头称是, 觉得这是个好招.刚才, 在看"C Traps and Pitfal原创 2013-03-17 15:22:31 · 1080 阅读 · 0 评论 -
(AIX)ld: 0711-244 ERROR: No csects or exported symbols have been saved
当使用IBM AIX系统的xlc编译器编译动态库时, 出现如题所示的错误(所编译的源文件内容为空):$ touch t.cpp$ cat t.cpp$ xlc -c -o t.o t.cpp"t.cpp", line 1.0: 1540-0809 (W) The source file is empty.$ xlc -qmkshrobj -o libt.so t.o ld: 07原创 2013-04-24 23:31:46 · 2931 阅读 · 0 评论 -
sizeof操作符
sizeof是一种操作符, 返回一个对象或类型的长度, 返回类型是size_t(即unsigned int的别名), 长度的单位是字节.形式如下:sizeof(type name);sizeof(expr);sizeof expr;在32位的机器上, 有: printf("%d\n", sizeof(char)); /* print: 1 */原创 2011-10-23 14:08:33 · 2719 阅读 · 0 评论 -
cygwin中动态库链接的问题
问题的出现(这里解释得比较累赘, 要找到答案, 可以直接进入第二章节)看书(Ruminations on C++)时, 以章节为单位写了一些独立的小程序(使用cygwin g++作为编译器, sublime text 2作为编辑器). 以下是目录结构, 后来将写日志的函数提取出来, 放到common/common.h(.cpp), 并生成libcommon.so动态库, 供其他程序调用原创 2013-10-31 23:22:06 · 7727 阅读 · 3 评论 -
在线手册(Online Manual)
HP C Reference: http://h21007.www2.hp.com/portal/download/files/unprot/hpux/HP%20C%20HPUX%20Reference%20Manual.pdf原创 2013-11-19 14:42:21 · 1353 阅读 · 0 评论 -
HP-UX的某些特性
aCC编译器代码中若有标准库的代码, 需要加-AA选项.原创 2013-10-08 16:20:01 · 962 阅读 · 0 评论 -
指向函数的指针
你知道以下声明语句的含义吗?float (*h(int, void (*)(int)))(int);以下是一个变量指针的定义语句:float* pf;以下是一个普通函数的声明语句:float f();请看以下声明语句:float* g();因为()的优先级高于*, 所以相当于:float* (g());g是一个函数, 返回值为float*, 参数为void而floa原创 2013-03-19 22:47:18 · 973 阅读 · 0 评论 -
条件表达式的类型
问题以下程序的输出是什么?#include using namespace std;void f(long);void f(const char*);int main(){ f(1?0:1); return 0;}void f(long){ cout << "long" << endl;}void f(const char*){原创 2015-02-25 22:45:48 · 2681 阅读 · 0 评论 -
C/C++ search path(头文件搜索路径)
GCC: Search PathXL C/C++: Directory search sequence for include files using relative path names原创 2014-01-14 23:19:35 · 3403 阅读 · 0 评论 -
《C++ Report》杂志文章链接
C++ ReportThe Last Waltz, C++ Report, SIGS, Vol. 11, No. 4, April 1999.Patterns++ - the Next Generation, C++ Report, SIGS, Vol. 9, No. 4, April 1997.CORBA: CASE for the late '90s?, C++ Repor原创 2014-07-27 19:36:16 · 1690 阅读 · 0 评论 -
函数参数中的引用
建议:1. 当函数要修改参数时, 建议参数使用指针或返回值, 而不是引用, 以增加可读性.void incr1(int &x) { ++x; }void incr2(int *x) { ++(*x); }int incr3(int x) { return x + 1; }int main() { int i = 2; incr1(i); //i = 3原创 2012-12-04 21:48:00 · 2227 阅读 · 0 评论 -
数组输出函数的实现
平时经常输出数组以测试数据,现在写一个通用的函数,函数原型为:/** * print array * @data : pointer that point to an array * @param n : number of data * @nPerline : number of data per line, 10 by default. */templatevo原创 2011-10-30 23:51:20 · 2369 阅读 · 0 评论 -
strlen, strcpy, strcmp函数的实现
在Bjarne Stroustrup(C++创始人,他的主页)所写的《The C++ Programming Language, special edition》书中的第6章6.6节的第10题练习题中,要求实现strlen, strcpy, strcmp三个函数,2011年11月份我已发过两篇文章来实现此三个函数(字符串处理函数的实现,strcmp函数的实现),以前的实现代码中,为了避免命名冲突,原创 2012-10-04 23:11:18 · 3132 阅读 · 0 评论 -
文件操作
1、所需头文件:fstream2、将数据从内存输出至硬盘文件:char srcFile[] = "src.txt";ofstream fout(srcFile);fout 3、将数据从硬盘文件输入内存:ifstream fin("data.txt");if (!fin){ cout > data[i++]){ ;}原创 2010-09-07 13:05:00 · 500 阅读 · 0 评论 -
malloc/free与new/delete的区别
1. malloc/free是C语言中的标准库函数, new/delete是C++中的运算符.2. 若动态创建的对象是类类型, 用new时, 自动调用该对象的默认构造函数:class Test{public: Test() {} ~Test() {}};int main(){ Test *t = new Test(); /* do so原创 2011-10-22 00:23:22 · 769 阅读 · 0 评论 -
指针与const限定符
1. 指向const对象的指针形式如下: (const 修饰的是int *, const 放在类型前和类型后的效果是一样的)const int *ptr;或int const * ptr;特点:1) 指针所指的对象是常量, 不能被改变.2) 指针本身并不是常量, ptr的值可以改变(即可以指向其他对象)注意1, 非const指针不能指向const对象原创 2011-10-20 23:29:07 · 1467 阅读 · 0 评论 -
内联函数与宏的区别
内联函数形式如下:inline int fac(int i){ return i * i;}内联函数像普通函数一样, 要进行参考类型检查, 但执行内联函数要比执行普通函数更高效, 因为调用内联函数的地方不需要中断调用, 在编译的时候, 内联函数被嵌入到目标代码中.适用场合:1) 代码短小, 里面不般不包含循环, 判断语句2) 需要被重复调用宏定义形式如下原创 2011-10-23 15:54:49 · 802 阅读 · 0 评论 -
顺序存储结构的线性表
顺序存储结构的线性表采用数组实现,优点是随机存取;缺点是删除时,需要移动数据,特别是当元素很多时,效率很低(针对此问题的解决方案是,采用间接寻址)。在本文的代码实现中,借鉴了Java的ArrayList的思想,数组自动扩充(增倍)。以下是采用C++语言的实现代码:/** * List.h */#pragma once/** * @Descripton : 顺序存储结构的线原创 2011-10-29 16:26:14 · 1120 阅读 · 0 评论 -
基于间接寻址的线性表
顺序存储结构的线性表中,有一个显著的缺陷是:增加或删除元素时,要移动大量数据(平均移动n/2次),当每个元素占用的空间较大时,效率很低。间接寻址就是解决此问题的一种方案。间接寻址的思想是:在顺序存储结构的基础上,每个元素存储数据的地址,增加或删除时只需移动地址,当元素很大且表长度很大时,效率的提升将很可观。C++语言的代码实现如下:/** * 基于间接寻址的顺序存储结构线性表原创 2011-10-30 12:20:27 · 1616 阅读 · 0 评论 -
for循环的条件判断中为什么用'!='而不用'<'
翻阅《C++ Primer中文版(第4版)》,里面出现的for大多都是类似如下的循环:vector ivec(10);for (vector::size_type ix = 0; ix != ivec.size(); ++ix) { ix = 1;}从以上的代码中,不由得让人产生两个疑问:1、判断条件为什么用'ix != ivec.size()'而不用'ix '呢?原创 2012-06-09 20:04:00 · 2549 阅读 · 0 评论 -
类的const static 成员变量
类的const static 成员变量需要在类的定义体外进行定义。示例如下:/** * Accout.h */#ifndef ACCOUT_H#define ACCOUT_H#include class Accout{public: static void get(std::ostream &os) { os << val; }private: const原创 2012-07-09 22:24:28 · 894 阅读 · 0 评论 -
struct与class关键字在定义类中的区别
struct关键字是从C语言中继承过来的,class和struct均可定义类,用它们定义类的唯一差别在于默认的成员保护级别和默认的继承保护级别(P57--第57页,2.8--章节2.8;P485,15.2.5):默认情况下,struct的保护级别为public,而class的保护级别为private。下面分别就这两种情况进行举例:例1:默认的成员保护级别struct S_Bas原创 2012-07-13 01:30:19 · 5503 阅读 · 0 评论 -
纠错题--类的名字冲突与继承
在《C++ Primer中文版第4版》书的第499页有个习题15.23,现将其进行略微地修改,整理如下:#include #include using namespace std;struct Base { int foo(int) { return 0; }protected: int bar; double foo_bar;};struct D原创 2012-07-13 00:57:54 · 833 阅读 · 0 评论 -
编译器优化: 函数中的局部变量延迟销毁
我们都知道, 函数中的局部变量在函数返回时, 要被销毁. 但在实际的编译运行过程中, 编译器进行了优化, 执行过程并不按照标准步骤进行.0. 准备工作编写测试用的Animal类, 每个Animal对象有一个唯一的标识, Animal类的实现为(获取本文中的源码):const bool DEBUG = true;typedef unsigned int UINT32;cla原创 2012-08-09 23:45:20 · 1867 阅读 · 0 评论 -
程序级的全局变量
本文将探讨程序级的全局变量在多文件中的使用。1. const全局变量const变量默认为文件级的局部变量://test.cppconst int SIZE = 10;以上定义的变量不能其它源文件中访问。很多人定义const全局变量时,会用到类似如下的代码结构://common.hconst int SIZE = 10;//func1.cpp#inclu原创 2012-09-02 16:57:34 · 1106 阅读 · 0 评论 -
对数组的引用
在Bjarne Stroustrup(C++创始人,他的主页)所写的《The C++ Programming Language, special edition》书中的第5章5.9节的第1题练习题中,要求写一个声明语句并进行初始化,“a reference to an array of 10 integers”,实现如下://an array of 10 integersint arry原创 2012-10-01 20:36:52 · 3068 阅读 · 0 评论 -
const_cast一个空指针
const_cast作用于一个空指针的值上,语法也是正确的,如: const char* p = NULL; char* q = const_cast(p);const_cast(p)的结果是:char*类型的NULL值Reference(在以下链接内容中搜索关键字"null"):MSDN: const_cast Operatorcppreferenc原创 2014-03-11 22:04:52 · 978 阅读 · 0 评论