C++高级特性
文章平均质量分 67
zhu2695
Coding life....
展开
-
C++不定参数的用法
/* 相关的宏定义: va_list vl; //定义一个指向参数列表的变量(一个...指针) va_start(vl,first_param); //把指向参数列表的变量初始化 va_arg(vl,mode); //获取下一个参数,参数类型由第二个参数指定,第二个参数用于在va_arg内部进行尺寸计算,以便找到下一个参数 va_end(vl); //结束*/#i转载 2013-04-04 12:40:15 · 1998 阅读 · 0 评论 -
宏定义 使用技巧总结
我在写代码的时候喜欢使用宏,不仅使代码看起来整洁,而且用好了还能极大的减轻编码的工作量,但是如果使用不当的话,出了问题查找起来就就非常的难了,下面的总结大部分是从网上看到的,也有一些是我自己在工作中总结出来的。宏使用中的常见的基础问题1. 防止一个头文件被重复包含#ifndef BODYDEF_H#define BODYDEF_H//头文件内容#endif2. 重新定义转载 2013-06-23 16:18:38 · 2465 阅读 · 0 评论 -
共享内存----实现进程间大数据的交换
共享内存实现进程间大数据的交换 进程间的数据交换和共享是一种非常重要和实用的技术。大、中型软件的开发设计多是由众多程序设计人员的合作完成,通常一个程序设计人员只负责其中一个或几个模块的开发,这些模块可以是动态链接库也可以是应用程序或是其他形式的程序组件。这些独立开发出来的程序模块最终需要作为一个整体来运行,即组成一个系统,在系统运行期间这些模块往往需要频繁地进行数据交换和数据共享,对于转载 2013-06-23 18:42:14 · 1261 阅读 · 0 评论 -
共享内存----实现进程间通信
C++使用共享内存实现进程间通信 文件映射是一种实现进程间单向或双向通信的机制。它允许两个或多个本地进程间相互通信。为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄。 为了实现共享文件,第一个进程先调用CreateFile方法。接下来调用CreateFileMapping方法来创建一个文件映射对象。并为文件映射指明一个句柄和名称。由于事件,信号,互斥对象和文转载 2013-06-23 18:47:58 · 1079 阅读 · 0 评论 -
C++中如何更好使用宏定义#define
首先我们需要明确一点,在c++中不提倡使用宏。我们可以使用const代替,来定义一般的常量。对于一些函数,可以考虑inline关键字,可以达到同样的高效率。1.为什么c++中不提倡使用宏呢? 这主要是由于宏背后所潜藏的安全机制以及误用频繁造成的。 对于宏,我们应明白其实质就是“替换”,编译器在编译阶段就会进行宏替换,使用你所定义的常量(函数)替换所有出现该定义位转载 2013-06-22 21:12:54 · 5403 阅读 · 0 评论 -
宏的返回值可以通过参数返回
#include using namespace std;//宏的返回值可以通过参数返回#define Double(input, ret) \{ \ ret = input * 2; \}int main(int argc, char* argv[]){ int ret; int input = 5; Double(input,原创 2013-06-22 21:34:12 · 1625 阅读 · 0 评论 -
代码自动生成-宏带来的奇技淫巧
众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你还不知道#和##,也不知道pres转载 2013-06-23 00:21:52 · 1110 阅读 · 0 评论 -
C++构造函数调用虚函数的问题
环境:XPSP3 VS2005 今天黑总给应聘者出了一个在C++的构造函数中调用虚函数的问题,具体的题目要比标题复杂,大体情况可以看如下的代码:class Base{public: Base() { Fuction(); } virtual void Fuction() { cout << "Base::Fuction" << endl; }}转载 2013-07-25 12:16:37 · 833 阅读 · 0 评论 -
C++箴言:绝不在构造或析构期调用虚函数
你不应该在构造或析构期间调用虚函数,因为这样的调用不会如你想象那样工作,而且它们做的事情保证会让你很郁闷。如果你转为 Java 或 C# 程序员,也请你密切关注本文,因为在 C++ 急转弯的地方,那些语言也紧急转了一个弯。 假设你有一套模拟股票处理的类层次结构,例如,购入流程,出售流程等。对这样的处理来说可以核查是非常重要的,所以随时会创建一个 Transaction 对象,将这个创建转载 2013-07-25 12:24:11 · 643 阅读 · 0 评论 -
变长结构体(尾随数据)
typedef struct tagTest { int uID; int iNum; int offset; int data[1]; //可变长数据,根据所需要数据类型定义 }Test;data是一个数据,个数为1,但是其实在使用的时候,不一定为1,也就是说在上述结构原创 2013-06-22 17:15:51 · 1037 阅读 · 0 评论 -
C++运算符重载
在运算符重载运用时应该注意以下几个问题:(1)C++中只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符;(2)C++中绝大部分的运算符可重载,除了成员访问运算符.,成员指针访问运算符.*,作用域运算符::,长度运算符sizeof以及条件运算符?:;(3)重载后不能改变运算符的操作对象(操作数)的个数。如:"+"是实现两个操作数的运算符,重载后仍然为双目运算符;(4)重载不能改变运算符转载 2013-06-06 23:22:58 · 610 阅读 · 0 评论 -
指针函数 与 函数指针 的区别
一、指针函数与函数指针的区别1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。表转载 2013-04-06 23:16:21 · 463 阅读 · 0 评论 -
函数对象 和 函数指针 的区别
参考一:函数对象(也称“算符”)是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。用函数对象代替函数指针有几个优点:1. 首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全局或者本地静态变量中,但是全局或者本地静态变量有某些我们不愿意看到的缺原创 2013-04-06 21:17:07 · 2657 阅读 · 0 评论 -
函数指针 和 函数对象
函数指针:函数指针:指向函数的指针变量。本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。如前所述,C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。函数指针有两个用途:调用函数和做函数的参转载 2013-04-06 21:07:50 · 728 阅读 · 0 评论 -
C++ 钻石继承与虚继承
首先,何为钻石继承,顾名思义,在类的继承过程中,继承结构是一个类似菱形(钻石)的结构就属于钻石继承,如下:这是一个最简单的钻石继承。实际上,在复杂的继承表中,只要子类按不同的继承路径回溯到基类有菱形结构,均属钻石继承。下面先看一个例子,钻石继承在C++程序设计中带来的问题。//diamond.cpp #include using namespace std; class转载 2013-04-15 23:28:23 · 2302 阅读 · 0 评论 -
C++ 虚函数表解析
虚函数表 对C++ 了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为V-Table。在这个表中,主是要一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中,所以,当我们用父类的指针来操作一个子类的时候,这张虚函数表就显得由为重转载 2013-04-17 23:31:28 · 502 阅读 · 0 评论 -
怎样调用基类的私有虚函数(private virtual function)
原理:如果基类包含虚函数,则派生类的对象都会有一个虚函数表指针,而且这个指针通常都是处于对象的最前面,即对象的地址和虚函数表指针的地址是一样的。 #include using namespace std;class Base{private: virtual void f0() { cout << "Base::f0()...." << endl; }原创 2013-04-17 23:54:32 · 2511 阅读 · 2 评论 -
根据GetLastError()返回值获取错误信息
VC中GetLastError()获取错误信息的使用在VC中编写应用程序时,经常需要涉及到错误处理问题。许多函数调用只用TRUE和FALSE来表明函数的运行结果。一旦出现错误,MSDN中往往会指出请用GetLastError()函数来获得错误原因。 可问题是,GetLastError()返回的只是一个双字节数值(DWORD)。OH,MY GOD!目前Win32的出错编号已经从0排到转载 2013-05-02 18:31:54 · 1657 阅读 · 0 评论 -
RTTI (Run-Time Type Identification,通过运行时类型识别)
参考一:RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。 RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型; (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生转载 2013-05-25 23:40:12 · 1509 阅读 · 0 评论 -
C++里 宏 的一些特别用法(一)
#include using namespace std;class Seq{public: Seq(){ cout<<"Seq::constructor()...."<<endl; }; ~Seq(){ cout<<"Seq::distructor()...."<<endl; }; void DoWork(){ cout<<"Seq::DoWork()...."<<endl;原创 2013-08-23 18:22:14 · 1011 阅读 · 0 评论