c++
lostyears
这个作者很懒,什么都没留下…
展开
-
C++ 命名规则
通则:1、在所有命名中,都应使用标准的英文单词或缩写。不得使用拼音或拼音缩写,除非该名字描述的是中文特有的内容,如半角、全角, 声母、韵母等。2、所有命名都应遵循达意原则,即名称应含义清晰、明确。3、所有命名都不易过长,应控制在规定的最大长度以内。4、所有命名都应尽量使用全称。5、如果命名使用缩写,则应该使用《通用缩写表》(见附录)中的缩写;原则上不推荐使用《通用缩写表》以外的转载 2011-11-15 12:59:11 · 1218 阅读 · 0 评论 -
构造函数和析构函数中调用虚函数有什么问题
一个类的虚函数在它自己的构造函数和析构函数中被调用的时候,它们就变成普通函数了,不“虚”了。也就是说不能在构造函数和析构函数中让自己“多态”。例如:class A{public: A() { foo();} // 在这里,无论如何都是A::foo()被调用! ~A() { foo();} // 同上 virtual void fo转载 2012-06-29 19:10:06 · 1309 阅读 · 0 评论 -
int与long区别
数据模型决定了C语言中基本数据类型与数据宽度的对应关系。我们常用的32位模型称为ILP32,而64位模型有三种:LP64、LLP64和ILP64。在64位模型中,指针一定是64位的,但是int和long的宽度则在不同的数据类型中有不同的定义。如下表:datatypeLP32ILP32LLP64LP64ILP64转载 2012-08-10 13:52:21 · 5244 阅读 · 0 评论 -
《C++应用程序性能优化》内存管理篇笔记(一)
Win32 进程私有:只能访问属于自己的4GB虚拟地址空间(父子进程例外,比如调试器利用父子进程关系来访问被调试进程的地址空间)。Dll本身没有属于自己的虚拟地址空间,而是其所属进程的虚拟地址空间,Dll的全局数据以及通过Dll函数申请的内存都是从调用其进程的虚拟地址空间中开辟。 基于页:是指虚拟地址空间被划分为多个称为“页”的单元,页的大小由底层处理器决定,x86中的页原创 2012-08-13 21:48:53 · 1005 阅读 · 0 评论 -
std::string的工具函数
一般来说,在处理字符串的时候通常会用到如下一些函数/方法:length、substring、find、charAt、toLowerCase、toUpperCase、trim、equalsIgnoreCase、startsWith、endsWith、parseInt、toString、split等。 如果使用STL中的std::string,它已经提供了如下一些比较有用的方法:leng转载 2013-01-09 18:13:35 · 3916 阅读 · 0 评论 -
C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的json解析库的使用方法。json官网上列出了各种语言对应的json解析库,作者仅介绍自己使用过的两种C++的json解析库:jsoncpp(v0.5.0)和Boost(v1.34.0)。 一.转载 2013-03-18 17:13:45 · 1126 阅读 · 0 评论 -
const定义的全局变量不能被其他文件访问,必须加extern 才能被访问吗?
const定义的全局变量不能被其他文件访问,必须加extern 才能被访问吗?C++ Prime 中文版第四版 P50, 拍个照,上图:说明:只截取了这部分,因为后一部分我感觉Blog作者没写好。转:http://blog.csdn.net/sergery/article/details/8450285转载 2013-04-19 10:49:09 · 1443 阅读 · 1 评论 -
C/C++:函数的编译方式与调用约定以及extern “C”的使用
函数在C++编译方式与C编译方式下的主要不同在于:由于C++引入了函数重载(overload),因此编译器对同名函数进行了名称重整(name mangle)。因此,在C++中引用其他C函数库时,需要对声明使用的函数做适当的处理,以告知编译器做出适应的名称处理。函数的调用约定涉及了函数参数的入栈顺序、清栈主体(负责清理栈的主体:函数自身还是调用函数者?)、部分名称重整。如,在转载 2013-09-04 14:34:22 · 883 阅读 · 0 评论 -
C++中类成员函数未实现,是否能够编译链接通过?
在写代码中经常发现有些类中的成员函数(包括nonvirtual func, virtual func and pure virtual func, static func)并未实现,但仍然能够正常的编译链接通过?没想太明白,于是做了一下试验。1)先用纯虚函数做试验#include "stdafx.h"#include using namespace std;cl转载 2015-07-16 16:14:28 · 4013 阅读 · 2 评论 -
google protocol buffer (C++,Java序列化使用实例)
转载: http://blog.csdn.net/eclipser1987/article/details/8525383 (eclipser@163.com)1.下载安装:google protocol buffer 的官网地址是:http://code.google.com/p/protobuf/ 建议下载稳定版本:protobuf-2.4.转载 2015-08-04 10:07:39 · 1085 阅读 · 0 评论 -
int( (LONG)(LONG_PTR)&(((type *)0)->field))的最好解释
在CSDN上查到的。ANSI C标准允许值为0的常量被强制转换成任何一种类型的指针,并且转换结果是一个NULL指针,因此((type *)0)的结果就是一个类型为type *的NULL指针。如果利用这个NULL指针来访问type的成员当然是非法的,但&( ((type *)0)->field )的意图仅仅是计算field字段的地址。聪明的编译器根本就不生成访问type的代码转载 2016-04-22 14:03:21 · 1321 阅读 · 0 评论 -
深入理解C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面转载 2016-04-22 15:52:43 · 662 阅读 · 0 评论 -
最多能喝多少瓶啤酒呢?
啤酒2元一瓶,四个瓶盖可换一瓶啤酒,2个空瓶也可换一瓶啤酒,10元最多可以喝几瓶?#include "stdafx.h"const int BOTTLE_COUNT_TO_A_BEER = 2;const int GAP_COUNT_TO_A_BEER = 4;const int PRICE_OF_A_BEER = 2;void get_beer_count(int& beer_c原创 2017-08-15 22:04:09 · 1802 阅读 · 1 评论 -
C++中的函数指针和函数对象总结
篇一、函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址。函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数。函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表);一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*fu转载 2017-09-21 21:36:48 · 390 阅读 · 0 评论 -
基于c++11的短小精悍生产者消费者模型
传统的c++98编写起来代码量挺大的,且受约束和限制,所以在空闲时间自写了个基于c++11的生产者消费者模型,采用了boost部分库,代码量一下子变得很简短且清晰。#include "stdafx.h"#include #include #include #include #include #include #include #include class task_h原创 2018-01-23 16:00:23 · 417 阅读 · 0 评论 -
拷贝构造函数及其参数类型
拷贝构造函数的参数类型必须是引用,而且通常情况下还是const的,但是const并不是严格必须的。#include#includeusingnamespace std; class CClass{public: CClass() : a(1), b("Hello, world.") { }转载 2012-03-13 16:53:11 · 1254 阅读 · 0 评论 -
使用const关键字进行函数重载
通常地,不同的重载函数不能具有相同数目的参数和参数类型。函数的返回值类型,虽然属于成员函数的signature的组成部分,但仅仅返回值类型不同,是不能构成函数重载的,因为这会造成redefinition的错误。 但有一个例外,就是使用const关键字进行函数重载,是成员函数成为const函数。见下面的代码:// Overloading Based on const#include转载 2012-03-13 16:44:30 · 7426 阅读 · 0 评论 -
关于内存对其问题(三)
第一种情况:struct BBB{ long num; // 4bytes char *name; // 4 bytes short int data; // 2 bytes转载 2012-03-13 16:38:38 · 583 阅读 · 0 评论 -
c++中的异常
本人对此转载文章添加若干注释。1.简介1.1常用的错误处理方式1.2 不常用的处理方式1.3 异常2. 异常的语法2.1 try2.2 catch2.3 throw2.4 函数声明3. 异常使用技巧3.1 异常是如何工作的 3.1.1 unwinding stack 3.1.2 RTTI3.2 是否继承std::exception转载 2011-11-23 21:59:07 · 693 阅读 · 0 评论 -
类在其自身的定义体内作为数据类型
只有static成员变量,指针或者引用,才可以在一个类的定义体内,用本类作为数据类型,如:class Bar{public: ......private: static Bar member1; //OK Bar*转载 2011-11-27 16:17:45 · 656 阅读 · 0 评论 -
动态分配资源的自动释放 – auto_ptr的实现原理
动态分配资源的自动释放的英文是 Resource Allocation In Initialization,通常缩写成RAII。根据《C++ Primer》第4版:“During stack unwinding, the function containing the throw, and possibly other functions in the call chain, are转载 2011-11-27 16:20:50 · 890 阅读 · 0 评论 -
处理new分配失败
1993年前,c++一直要求在内存分配失败时operator new要返回0,现在则是要求operator new抛出std::bad_alloc异常。很多c++程序是在编译器开始支持新规范前写的。c++标准委员会不想放弃那些已有的遵循返回0规范的代码,所以他们提供了另外形式的operator new(以及operator new[])以继续提供返回0功能。这些形式被称为“无抛出”,因为他们没用过原创 2011-11-21 21:07:21 · 4218 阅读 · 0 评论 -
函数对象(functor)
简单地说,如果一个类重载了调用操作符(),那么这个类的对象就是所谓的函数对象。 一、关于操作符重载的简单说明1. 调用操作符()的重载必须以成员函数的形式出现,另外还必须以成员函数形式重载的操作符有:=、[ ]和->2. IO操作符和>>的重载则必须以友元函数的形式出现。3. 下面4个符号是不能被重载的:::、 .*、 . 和 ?:转载 2012-01-14 16:41:50 · 622 阅读 · 0 评论 -
C++类中拷贝构造函数详解
a. C++标准中提到“The default constructor, copy constructor and copy assignment operator, and destructor are special member functions.[Note: The implementation will implicitly declare these member functions转载 2012-02-11 17:59:57 · 802 阅读 · 0 评论 -
为何mfc不使用 dynamic_cast这样的基指针想派生类指针的显示转换? .
为何mfc不使用(或较少使用) dynamic_cast 原因在于: dynamic_cast 在c++中,如果你希望将一个基指针转换成一个派生类指针, 1)一般情况下, 这个基指针本来就是一个派生类的指针. 当转换为派生类指针的时候,可以访问这个派生类的特有的函数或者成员变量. 2) 如果这个基指针本来就不是一个派生类的指针,那么访问这个派生类的函数或成员变量的时候转载 2012-02-20 18:55:09 · 851 阅读 · 0 评论 -
static_cast、dynamic_cast、reinterpret_cast和const_cast之间的区别
C-style cast举例: int i; double d; i = (int) d; 上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。 下面是一个简单的程序:#include转载 2012-03-08 18:34:58 · 443 阅读 · 0 评论 -
一个进程在内存中的布局
对于一个完整的程序,在内存中分布情况如下图: 值得一提的是:在C#中struct存放在栈区,class存放在堆区,所以一般struct要比class要快的。 堆和栈的比较表(仅针对C++) 栈(Stack)堆(Heap)申请方式由OS自动分配。例如在函数声明一个局部变量int转载 2012-03-08 18:54:28 · 520 阅读 · 0 评论 -
虚函数在对象中的内存布局
典型地,C++通过虚函数实现多态性。多态性的定义:“无论发送消息的对象属于什么类,他们均发送具有相同形式的消息,对消息的处理方式可能随接受消息的对象而变。”具体地说,“在某个基类上建立起来的类的层次结构中,可以对任何一个派生类的对象中的同名成员函数进行调用,而被调用的成员变量所提供的处理可以随其所属的类而改变。”虚函数首先是一种成员函数,它可以在该类的派生类中被重新定义并被赋予另外一种处理功能。转载 2012-03-08 19:15:30 · 583 阅读 · 0 评论 -
C++中虚继承防止二义性
虚继承,就是在被继承的类前面加上virtual关键字,这时被继承的类称为虚基类,如下面代码中的base类。虚继承在多重继承的时可以防止二义性。 class base; class derived1 :virutalpublic base; class derived2 :virtualpublic base; class derive转载 2012-03-08 19:21:36 · 746 阅读 · 0 评论 -
最快速度找到内存泄漏
内存管理是C++程序员的痛。我的《内存管理变革》系列就是试图讨论更为有效的内存管理方式,以杜绝(或减少)内存泄漏,减轻C++程序员的负担。由于工作忙的缘故,这个系列目前未完,暂停。这篇短文我想换个方式,讨论一下如何以最快的速度找到内存泄漏。确认是否存在内存泄漏我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。例如:class CMyApp转载 2012-03-08 19:39:25 · 596 阅读 · 0 评论 -
编写安全代码——不要用memcmp比较structure
本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。作者:gfree.wind@gmail.com博客:linuxfocus.blog.chinaunix.net 请看下面的代码#include #include #include转载 2012-03-09 13:56:37 · 783 阅读 · 0 评论 -
CALLBACK, WINAPI, AFXAPI和函数调用方式
(VC编译器下) 1. CALLBACK,WINAPI和AFXAPI到底是什么?它们分别在什么地方被定义的?在头文件windef.h中,CALLBACK, WINAPI, APIENTRY……#define CALLBACK __stdcall#define WINAPI __stdcall#define WINAPIV __cde转载 2012-03-13 16:17:01 · 2708 阅读 · 0 评论 -
关于内存对齐问题(一)
a.基本类型:所有的基本类型都有相应的对齐参数,编译器在编译时,会用全局的对齐参数和当前类型的对齐参数中较小的一个进行对齐。比如,编译时指定暗8bytes对齐(用#pragma pack(8)实现之),可是由于一个char变量的大小为一个byte,所以最后还是按1byte对齐。b.复合类型:复合类型的对齐原则,就是取其成员变量数据类型的字节数的最大者和在编译时指定的对齐数两者之间较转载 2012-03-13 16:18:56 · 585 阅读 · 0 评论 -
关于内存对齐问题(二)
一个类的对象到底有多大?其大小由什么因素影响?我们假定这个类没有继承任何其他类,且没有虚函数。先看下面例子: #include using namespace std; class Concrete{public: Concrete():val(0), c1('A'), c2('B')//, c3('C')转载 2012-03-13 16:29:29 · 487 阅读 · 0 评论