随笔 - 37  文章 - 0  评论 - 150  阅读 - 29万

随笔分类 -  C/C++

[C/C++]如何解读返回函数指针的函数声明
摘要:今天在看《深入理解C++11》的时候,看到一段有意思的代码:int (*(*pf())())() { return nullptr; }我立刻就懵了——从来没有见过这样的函数声明。那么它究竟是一个怎样的函数呢?我努力回忆起《C专家编程》一书的内容,把其中解读变量声明的方法应用于该函数上,最终读懂了该函数。下面是大致的解读过程。首先,要确定声明中出现的操作符的优先级。显然,函数调用操作符()的优先级是高于指针解引用操作符*的。另外,小括号总是具有最高优先级。其次,要确定在声明中标识符与某个操作符结合起来的时候有什么意义。例如:a() a是一个函数*a a是一个指针由于函数声明的特殊性,当指... 阅读全文
posted @ 2013-10-27 22:08 Zplutor 阅读(7359) 评论(2) 推荐(1) 编辑
[C]字符串与数值互转换的语义区别
摘要:字符串与数值互相转换是非常常用的功能,大家都对它习以为常了。我想除了程序库的编写者之外,没有人会像我这样为了这个问题纠结一两天。C提供了一套函数用于字符串与数值互转换,包括itoa,atoi,strtol等。为了方便叙述,我将这套函数抽象成下面两个伪C函数:string C_IntToStr(int value, int radix);int C_StrToInt(string str, int radix);根据函数名称就可以知道它们的用途。注意本文只讨论整型值,浮点数不在该范围内。对于十进制的转换来说,这两个函数的行为很正常;对于非负数的非十进制转换来说,也很正常。这都没什么好说的。可是对 阅读全文
posted @ 2012-12-04 14:48 Zplutor 阅读(1581) 评论(0) 推荐(0) 编辑
[C++]将标准IO库应用于套接字
摘要:最近在写一个网络程序,需要将字符串一行一行地写入套接字,再一行一行地从套接字读取出来。由于没有现成的函数来以行的方式来操作套接字,只能自己编写这样的函数了。忽然想到C++ 标准的IO库可以非常方便地操作输入输出流,不知道能不能将其扩展,应用到套接字上呢?回答是肯定的,标准库本身就是一个可方便扩展的库,在《C++标准程序库》一书中详细地讲解了如何对其进行扩展。下面的内容就是根据这本书的指导写出的,主要是我自己对其中的一些理解,所以跟书上的很相似。首先来看一下标准库中有关IO的类体系结构:除了ios_base之外,其它类都定义为模板,这是因为C++中有两种字符类型:char和wchar_t。ios 阅读全文
posted @ 2012-02-23 22:16 Zplutor 阅读(2655) 评论(3) 推荐(2) 编辑
[C/C++]函数如何返回struct或class对象
摘要:本文写于我对C++尚不是很了解的时期,所以文中存在很多漏洞。为了避免浪费你的时间,请绕道!所有的C、C++教科书都警告我们:不要通过函数来返回struct或 class对象,否则会造成内存复制以及复制构造函数的调用,降低性能。相信这句话已经成为了一个常识,大家都能牢记于心。然而,有时候我们不得不违反这个警告,例如,通过函数获取一个std::string对象(以个人的经验而言,这种情况是很常见的,我经常要通过函数创建一个新的对象)。不知道从什么时候起,当我面对这种情况的时候会通过引用来获取这个对象,像这样:std::string GetString();std::string& str 阅读全文
posted @ 2011-09-25 16:28 Zplutor 阅读(20785) 评论(11) 推荐(2) 编辑
[C++]实现委托模型
摘要:我对.Net的委托模型印象很深刻,使用委托,可以快速实现观察者模式,免去写很多繁杂重复的代码。遗憾的是,C++并没有提供这样的模型,为了达到相似的目的,需要继承一个类并重写virtual方法,这种做法需要写很多代码,效率比较低下(使用过MFC的应该都能体会到)。然而,在强大的C++面前,没有什么是不可能的,已经有很多人针对这个问题进行过研究,并且实现了各种委托模型,其中最著名的就是FastDelegate,这个模型在《Member Function Pointers and the Fastest Possible C++ Delegates》中提出(原文地址:http://www.codep 阅读全文
posted @ 2011-09-17 18:55 Zplutor 阅读(16421) 评论(22) 推荐(5) 编辑
[C/C++]在头文件中使用static定义变量意味着什么
摘要:看到有一位同学在头文件中这么写:static const wchar_t* g_str1 = …static const wchar_t* g_str2 = …这种定义变量的方式我从来没有见过,而且它还能顺利通过编译,于是我很想知道编译器是如何处理这种变量定义的。定义全局变量时使用static,意味着该变量的作用域只限于定义它的源文件中,其它源文件不能访问。既然这种定义方式出现在头文件中,那么可以很自然地推测:包含了该头文件的所有源文件中都定义了这些变量,即该头文件被包含了多少次,这些变量就定义了多少次。假如将上面两行代码的static去掉,编译的时候就会出现变量重定义的错误,这进一步证实了上 阅读全文
posted @ 2011-08-06 13:43 Zplutor 阅读(28426) 评论(5) 推荐(7) 编辑
[C/C++]宽字符与控制台程序
摘要:在我刚开始学C/C++的时候,字符类型使用的都是char。接触Win32编程之后,养成了使用wchar_t的习惯,于是再写控制台程序的时候自然就使用wchar_t了。然而在控制台程序中使用宽字符会导致各种奇怪的问题,这些问题主要是在输出上。下面分享一下我在这方面的心得。首先来看一下这段代码:#include <stdio.h>int main() { wprintf(L"%s", L"博客园"); return 0;}wprintf用于输出宽字符类型的字符串,看上去似乎没有错误。但这段代码的输出却是三个问号。这是使用wprintf时最典型的问 阅读全文
posted @ 2010-11-27 10:06 Zplutor 阅读(6066) 评论(0) 推荐(2) 编辑

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示