
C++
文章平均质量分 80
加菲猫ooo
这个作者很懒,什么都没留下…
展开
-
虚析构函数
虚析构函数虚析构函数 虚析构函数是为了解决这样的一个问题:基类的指针指向派生类对象,并用基类的指针删除派生类对象。 如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。 所以基本的一条是:无故的声明虚析构函数和永远转载 2012-10-10 14:53:09 · 469 阅读 · 0 评论 -
线程与线程回调函数
本来回调与线程之间没多大关系,只是线程是采用回调的方式来执行你的代码,这个是它们之间存在的一点联系。回调函数:一般用于模块解耦,提供功能扩展用。要清楚的认识回调函数,需要分清这两者,调用方(即接口声明方)、(即被调用方)实现方。事实上回调函数无处不再,控制台中的main、WIN32中的WinMain、WINDRV中的DriverEntry都是回调函数,所以你会发现回调函数的原型转载 2012-11-05 14:38:42 · 11026 阅读 · 0 评论 -
彻底理解C/C++调用约定
__stdcall被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall 的前面部分由ecx,edx传),函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。目录函数调用约定MFC缺省调用约定名字修饰约定函数调用约定 __stdcall是函数调用约定的一种,函数调原创 2012-11-07 14:02:57 · 939 阅读 · 0 评论 -
#pragma用法归纳
#pragma是一个C语言中的预处理指令,在所有的预处理指令中,#Pragma 指令可能是最复杂的了.它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为:#pragma Para转载 2012-11-09 11:31:32 · 549 阅读 · 0 评论 -
__FILE__、__LINE__
注:本文转自蚂蚁跳楼博客园,感谢作者整理 前言:我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式转载 2012-11-26 11:29:13 · 651 阅读 · 0 评论 -
C++类中的枚举
有时我们希望某些常量只在类中有效。 由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用 const 修饰数据成员来实现。const 数据成员的确是存在的,但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。 不能在类声明中初始化 co原创 2012-11-10 17:45:12 · 592 阅读 · 0 评论 -
C/C++中的static
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)第一个作用:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容#include增加这条语句char a = ‘A‘; // global variab转载 2012-11-26 16:51:51 · 83 阅读 · 0 评论 -
string::npos
cpp primer中讲到find方法返回一个名为 string::npos 的特殊值,说明查找没有匹配。粘上以备记忆.The string class provides six search functions, each named as a variant offind. The operations all return astring::size_type value tha转载 2012-11-29 16:04:17 · 615 阅读 · 0 评论 -
C中的static
首先说一下什么是静态变量(常量也是一样的道理),你可以这么理解,不管哪声明的静态变量,其实都可以当作全局变量,但和普通的全局变量不同的是该静态变量只能在其声明的作用域中使用,出了这个作用域就不能用了。那么你的问题也就出来了,在函数内声明的静态变量其实就是一个全局变量,只不过它只能在函数内部用;在函数外声明的,有两种,一种是类中的成员(C++的概念,既然你问c这里就不赘述了),另外一种就是文件作转载 2012-11-26 17:02:31 · 455 阅读 · 0 评论 -
static_cast作用
用法:static_cast ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法: ①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成派生类表示)时,由转载 2012-11-05 09:55:33 · 705 阅读 · 0 评论 -
从一道面试题看指针与数组的区别
从一道面试题看指针与数组的区别 题记: 关于指针,推荐看一下csdn飞天御剑流的《再再论指针》,相信对C语言指针会有一个更为清晰全面的理解。 指针是C语言的精华,它是一柄“双刃剑”,用的好与坏就看使用者的功力了。下面就一道面试题,看一下指针与数组的区别。 char*p1,*p转载 2012-10-09 18:31:29 · 523 阅读 · 0 评论 -
C++ 虚析构函数
类型需要虚析构函数的另外一个特征 是该类型具有指针成员或引用成员。如果有指针成员和引用成员,则该类型通常需要实现析构函数以及拷贝操作。 通常,一个实现了析构函数的类型同时也需要实现拷贝构造函数与拷贝复制函数。 作为一个经验法则:如果你有一个带有虚函数功能的类,则它需要一个虚析构函数,原因如下: 1. 如果一个类有虚函数功能,它经常作为一个基类使用。 2.如果它是转载 2012-10-10 10:25:39 · 349 阅读 · 0 评论 -
C++虚继承1
昨天和同学对c++虚继承这部分 产生了一些争论,发觉自己对技术越来越浮躁了。不得不痛下决心。一看c++虚继承的内部实现(很浅很浅的看看)。 以下内容来自自己实验,希望各位大哥指点。当然要想获得权威的解释,看《Inside C++ Object Model》 让我们从最简单的开始。以下测试代码。代码class Base{public: Base()转载 2012-09-25 09:58:12 · 595 阅读 · 0 评论 -
C++虚继承2
上一篇只是初步的写了一下虚继承,很不清楚而且有的地方自己理解也不到位。这回详细总结一下。以下内容来自vs2008 默认设置下。类的布局可以通过-d1reportSingleClassLayout查看。 让我们从最简单的类结构开始。 代码 class A{public: int a; void af(); void virtual vaf(); };v转载 2012-09-25 10:00:03 · 455 阅读 · 0 评论 -
浅谈C++中虚基类的内存布局
今天重温C++的知识,当看到虚基类这点的时候,那时候也没有太过追究,就是知道虚基类是消除了类继承之间的二义性问题而已,可是很是好奇,它是怎么消除的,内存布局是怎么分配的呢?于是就深入研究了一下,具体的原理如下所示:来至于网络:http://www.cdtarena.com 在C++中,obj是一个类的对象,p是指向obj的指针,该类里面有个数据成员mem,请问obj.mem和p->原创 2012-09-26 09:24:05 · 1702 阅读 · 0 评论 -
C++多继承相关
class A{ virtual int f();};class B{ virtual void f();};如果有一个类C同时集成了A和B,那他继承的是那个f()啊?我感觉这样不对啊,c++只能重载是参数不相同的函数吧?----------------------------------------------------------------原创 2012-10-19 10:56:30 · 443 阅读 · 0 评论 -
C++继承经典案例
c++继承经典例子#include class Base{private: int b_number;public: Base( ){} Base(int i) : b_number (i) { } int get_number( ) {return b_number;} void pri转载 2012-10-29 14:50:26 · 548 阅读 · 0 评论 -
C++虚拟继承解决菱形继承的二义性
在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子,交通工具类可以派生出汽车和船连个子类,但拥有汽车和船共同特性水陆两用汽车就必须继承来自汽车类与船类的共同属性。 由此我们不难想出如下的图例与代码:转载 2012-10-29 15:36:03 · 1197 阅读 · 0 评论 -
C++ 编译器的函数名修饰规则
C++ 编译器的函数名修饰规则 函数名字修饰(Decorated Name)方式 函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的转载 2012-12-10 11:17:43 · 576 阅读 · 0 评论 -
C++常见编译/链接错误及其解决办法
1. 解决error LNK2005: ___crtExitProcess 已经在 LIBCMTD.lib(crt0dat.obj) 中定义有的時候, 在 Debug 模式下編譯沒問題, 換到 Release 模式就發生一堆問題.典型的例子, 就是因為 c++ runtime library 設定不同, 所造成的重複定義連結錯誤.而另一個常見的例子是 專案與 libra转载 2012-12-10 11:16:40 · 1121 阅读 · 0 评论 -
多线程游戏服务器技术开发
这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人写在前面的存在即合理, 不管什么事, 都是有原因有理由有前提的, 所以在谈论之前我们先要明确一些东西 1. 服务器端使用多线程的必要条件是多核, 且物理核的计算能力总和>>服务器程序的计算量. 如果不满足上述条件, 应该先考虑硬件配置问题. 2. 为什么要用多线转载 2012-12-17 12:47:27 · 880 阅读 · 0 评论 -
小谈Online-game服务器端设计(1、2)
原文地址:http://dev.gameres.com/Program/Abstract/Thinking/online_g_1_2.htm转载地址:http://www.cnblogs.com/steven_oyj/archive/2010/05/29/1747039.html谈这个话题之前,首先要让大家知道,什么是服务器。在网络游戏中,服务器所扮演的角色是同步,广播和服务器主动的一些行转载 2013-03-27 11:19:17 · 642 阅读 · 0 评论 -
预编译头
如果你的vc程序中使用了预编译头,并且生成过调试版本。如果有一天你突然发现目录中有个vc100.pdb的莫名其妙的东西而把它删掉了,当你尝试再次生成程序并调试时,你会收到这个错误:×:\××××××\vc100.pdb 不是创建此预编译头时使用的 pdb 文件,请重新创建预编译头。现在你知道了了吧,vc100.pdb是创建此预编译头时使用的 pdb 文件,在再次生成调试版本时还是要转载 2013-03-28 14:31:21 · 920 阅读 · 0 评论 -
#define WIN32_LEAN_AND_MEAN作用
MSDN的资料: 为加速生成过程,Visual C++ 提供了如下定义(这些定义通过排除一些不太常用的 API,减小了 Win32 头文件的大小): VC_EXTRALEAN WIN32_LEAN_AND_MEAN VC_EXTRALEAN 定义 WIN32_LEAN_AND转载 2013-04-12 10:15:09 · 1283 阅读 · 0 评论 -
UNREFERENCED_PARAMETER 的作用
我们从 UNREFERENCED_PARAMETER 开始吧。这个宏在 winnt.h 中定义如下: #define UNREFERENCED_PARAMETER(P) (P) 换句话说 UNREFERENCED_PARAMETER 展开传递的参数或表达式。其目的是避免编译器关于未引用参数的警告。许多程序员,包括我在内,喜欢用最高级别的警告 Level 4(/W4)进行编译。Level转载 2013-04-25 14:02:46 · 618 阅读 · 0 评论 -
Step By Step(C++模板目录)
对于C++模板,其强大和高深早已为业界所共识。相比于其他语言,C++是在设计之初便已经提供了对泛型和模板的支持。然而随着语言的发展,与其相关的库也是层次不穷,其中的佼佼者主要为STL(已为C++标准库)、Boost和Loki等。很多酷爱C++的开发者投入了大量的时间和精力去深入的研习它们,当然回报也是相当丰厚的,因为他们的能力以及设计理念较之以前相比也确实得到了较大的提高。这个C++模板系列博客,转载 2013-04-17 20:22:14 · 576 阅读 · 0 评论 -
服务器开发之定时器设计
很久之前听著名页游服务器主程讲座时,讲到过定时器的实现,基本思路如下(易语言) while(true) { 对定时器进行排序。 for(遍历定时器) { if 如果定时器到: cal转载 2013-04-18 12:37:17 · 1226 阅读 · 0 评论 -
指针和数组的区别
C++/C程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。下面以字符串为例比较原创 2013-05-11 16:15:10 · 739 阅读 · 0 评论 -
"undefined reference to" 问题解决方法
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实经常会遇到,在此,我以详细地示例给出常见错误的各种原因以及解决方法,希望对初学者有所帮助。1. 链接时缺失了相关目标文件(转载 2013-05-24 16:48:10 · 816 阅读 · 0 评论 -
调试之调用堆栈
调试是程序开发者必备技巧。如果不会调试,自己写的程序一旦出问题,往往无从下手。本人总结10年使用VC经验,对调试技巧做一个粗浅的介绍。希望对大家有所帮助。今天简单的介绍介绍调用堆栈。调用堆栈在我的专栏的文章VC调试入门提了一下,但是没有详细介绍。首先介绍一下什么叫调用堆栈:假设我们有几个函数,分别是function1,function2,function3,funtion4,且fu转载 2013-03-25 16:52:03 · 780 阅读 · 0 评论 -
WIN下开发快捷操作
Ctrl+m+Crtr+o折叠所有大纲 VS中的书签功能能够很好地解决这一问题。首先把光标放到需要标记书签的代码处,然后点击VS中的插入书签按钮,就完成了设置书签的操作。也可以使用设置书签的快捷键:Ctrl+B,Ctrl+T来完成书签的设置或取消。Ctrl+M+Crtr+P: 停止大纲显示Ctrl+K+Crtr+C: 注释选定内容Ctrl+K+Crtr+U: 取消选定转载 2013-03-25 16:51:00 · 611 阅读 · 0 评论 -
AS3小知识点
1.如何让flash.text.TextField可编辑?不是editable=true或readonly=false...而是type = TextFieldType.INPUT;参考type 属性 type:String [] 语言版本 : ActionScript 3.0 RuntimeVersions: AIR 1.0, Flash Player 9转载 2012-12-17 14:53:21 · 601 阅读 · 0 评论 -
__int64和long long
在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf(“%lld”,a),printf(“%I64d”,a),和cout 本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译器分转载 2013-01-06 17:19:53 · 845 阅读 · 0 评论 -
C++与AS3
ActionScript3(简称AS3)与C++都是面向对象的编程(OOP)语言,都具有OOP的特性如封装、继承、多态等。二者在语法上有许多相似之处,基本上学过C++之后再学习AS3感觉并不是特别吃力。 但是二者也有着本质的区别,ActionScript3是脚本语言,也就是解释型语言,而C++是编译型语言。ActionScript3主要是基于ECMAScript4 Netscape转载 2013-01-07 13:54:24 · 2862 阅读 · 0 评论 -
再说TCMalloc
http://code.google.com/p/gperftools/downloads/list http://blog.163.com/cp7618@yeah/blog/static/70234777201251345350339/Tcmalloc通过preload或者直接动态链接的方式对malloc等内存分配和释放函数进行截获并提供服务。Tcmalloc提供接口主要涵盖转载 2013-02-02 13:12:09 · 658 阅读 · 0 评论 -
google tcmalloc WIN下使用
所用版本为:google-perftools-1.6a.)作为动态链接库时:不用改变任何设置,编译即可。使用时,工程设置如下:1.运行时库改为 mdd/md2.附加依赖库 libtcmalloc_minimal.lib3.强制符号引用 __tcmalloc这样就可以正确的使用tcmalloc库了(dll复制过去)b.)作为静态链接库时转载 2013-02-04 09:22:53 · 1825 阅读 · 0 评论 -
深入体会__cdecl与__stdcall
在学习C++的过程中时常碰到WINAPI或者CALLBACK这样的调用约定,每每觉得十分迷惑。究竟这些东西有什么用?不用他们又会不会有问题?经过在网上的一番搜寻以及自己动手后,整理成以下的学习笔记。1.WINAPI与CALLBACK 其实这两者在Windows下是相同的,在windef.h中定义如下:Code#ifdef _MAC#define CALLBACK转载 2013-02-04 11:04:10 · 564 阅读 · 0 评论 -
CTime和CTimeSpan
上一节中鸡啄米讲了MFC常用类CString类的用法,本节继续讲另外两个MFC常用类-日期和时间类CTime类和CTimeSpan类。 日期和时间类简介 CTime类的对象表示的时间是基于格林威治标准时间(GMT)的。CTimeSpan类的对象表示的是时间间隔。 CTime类和CTimeSpan类一般不会被继承使用。两者对象的大小都是8个字节。转载 2013-01-21 15:06:19 · 6319 阅读 · 1 评论 -
身份证验证算法(C++实现)
#include #include using namespace std;//作者:sbfqmq E-Mail:sbfqmqyhaha@163.com/*公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。1、地址码表示编码对象常住户口所在县(市、旗、区)转载 2013-03-22 12:33:40 · 3119 阅读 · 0 评论 -
再论数组和指针的区别
引言 指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用。于是乎,很多程序设计者就被搞糊涂了。而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针"。很幸运,我的大学老师就是其中之一。时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解。 想必这种误原创 2013-05-11 16:21:22 · 667 阅读 · 0 评论