C/C++
文章平均质量分 75
工程师WWW
R
展开
-
升级 GCC 支持C++11
一、错误发生情景:使用sh setup.sh安装软件时,报以下错误:...configure: error: *** A compiler with support for C++11 language features is required.---ERROR: failed to configure xapian-core-scws, see 'setup.log' for m...原创 2020-01-08 19:37:23 · 2434 阅读 · 2 评论 -
c++ 11 lambda表达式
#include <iostream> #include <typeinfo> #include <type_traits> #include <memory> #include <thread> #include <atomic> usingnamespacestd...原创 2019-12-24 22:23:18 · 366 阅读 · 0 评论 -
string 和 string.h (和cstring等价)头文件的区别
为什么下面这段代码 #include void main() { string aaa= "abcsd d"; printf("looking for abc from abcdecd %s/n", (strcmp(aaa,"abc")) ? "Found" : "Not Found"); } 不能正确执行,说是string类型没有定义 而下面: #include原创 2009-09-08 14:55:00 · 1720 阅读 · 0 评论 -
C++类对象的复制-拷贝构造函数(深拷贝,浅拷贝)
对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include using namespace std;class CExample {private: int a;public: CExample(int b) {原创 2009-09-23 10:31:00 · 2756 阅读 · 0 评论 -
VC编写DLL
1.用VC建立一个WIN32 DLL我们利用VC编写DLL有几种方法.如果用VC建立一个WIN32 DLL 工程.那这个工程就应该只导出C++的类或全局变量.和全局函数.方法就是在CPP文件中编写你的代码,为每个需要导出的元素进行导出办法是增加如下语句:_declspec(dllexport)你当然可以把它定义成宏例如,如果是一个类STUDENT需要导出, 那么声明时应该是这样写原创 2009-10-19 10:37:00 · 1614 阅读 · 0 评论 -
C宏定义的简单总结
1,防止一个头文件被重复包含 #ifndef BODYDEF_H #define BODYDEF_H //头文件内容 #endif 2,得到指定地址上的一个字节或字 #define MEM_B( x ) ( *( (byte *) (x) )原创 2011-10-08 17:16:02 · 1148 阅读 · 0 评论 -
C++内存分配秘籍—new,malloc,GlobalAlloc详解
一。关于内存 1、内存分配方式 内存分配方式有三种: (1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。原创 2011-11-15 09:45:10 · 3129 阅读 · 2 评论 -
c++中引用和指针的内部实现
c++中,引用和指针时比较让人混淆的。它们的外在区别想必很多人都知道。在这我再重复一下。引用在定义时必须初始化,即该引用所引用的必须时确实存在的变量,不能为NULL。而指针就没有这个限制。有人说,引用就相当于一个变量的别名,对该引用所做的操作就相当于对原变量一样。我不太认同这个看法。在内部实现上,其实引用也是通过地址实现的。因此我更想称引用为一种特殊的指针。让我们看看下面这个简单的例子。#原创 2011-10-27 17:13:32 · 1965 阅读 · 0 评论 -
C 数据类型总结
一、数据类型 数据类型是按照规定形式表示数据的一种方式,不同的数据类型占用空间也不同。 为了学习方便,特意整理了下C语言的数据类型的分类结构,如下图: 对于数据类型,还应该明白以下几点 1、整型数据 int可以有修饰符 short、long、long long三种,后面的int可省略,默认的整形数据常量为int(#add,共4原创 2011-10-28 16:36:48 · 1334 阅读 · 0 评论 -
c中和java中数组的区别
对于原语类型的数组,如int[] a,在C里面只要这样定义之后就可以用a[i]使用了,但是在JAVA里面是不行的,必须用int[] a = new int[LENGTH];来为数组分配空间。这里的a更应该看成C里面的指针,它和C里面的int* a是一样的,因为这个a(C里面的)也要先malloc一个空间之后才可以用。 对于对象数组,则要“两次分配”,如:原创 2009-09-19 23:05:00 · 2651 阅读 · 0 评论 -
关于虚拟继承的思考
虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要(因为这样只会降低效率和占用更多的空间,实在是一无是处)。 以下面的一个例子为例: #include #include class CA { int k; //为了便于说明后面的内存结构特别添加原创 2011-10-29 13:53:08 · 1367 阅读 · 1 评论 -
关于拷贝构造函数和赋值运算符
重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。 以下讨论中将用到的例子:class CExample{public: CExample(){pBuffer = NULL; nSize = 0;} ~CExample(){delete pBuffer;} void Init(int n){ pBuffer = new char[n]; nSiz原创 2011-10-29 14:36:03 · 1340 阅读 · 0 评论 -
C++局部类和嵌套类
如果嵌套类型和其外部类型之间的关系需要成员可访问性语义,需要使用C++嵌套类,嵌套类型不应针对其声明类型以外的类型执行任务,而C++局部类允许类、结构和接口被分成多个小块儿并存储在不同的源文件中,这样的实现很容易开发和维护。C++局部类:在一个函数体内定义的类称为局部类。局部类中只能使用它的外围作用域中的对象和函数进行联系,因为外围作用域中的变量与该局部类的对象无关(#add,这半句是原创 2011-10-29 13:56:06 · 1789 阅读 · 0 评论 -
c++ io标准库
原文见:http://hi.baidu.com/dwl_1989/blog/item/5cbad08b212849fbf01f369f.html我们从一开始就一直在利用C++的输入输出在做着各种练习,输入输出是由iostream库提供的,所以讨论此标准库是有必要的,它与C语言的stdio库不同,它从一开始就是用多重继承与虚拟继承实现的面向对象的层次结构,作为一个c++的标准库组件提供给程序原创 2011-10-29 14:24:37 · 3302 阅读 · 0 评论 -
理解句柄类
在代理类的帮助下,我们已经可以实现在一个容器里存储一个类层次里所有类型的对象,但是代理有一个很明显的缺点,就是需要复制对象,当一个对象非常大或者是一种不能轻易复制的资源的时候,这个实现遇到了很大的困难,于是我们有了句柄(handle)类这个技术。 我们有这么一个类class point{public: point():x_cdt(0),y_cd原创 2011-10-29 14:34:10 · 1358 阅读 · 0 评论 -
private的虚函数
3.1 private的虚函数 考虑下面的例子:class A{public:void foo() { bar();}private:virtual void bar() { ...}};class B: public A{private:virtual void bar() { ...}}; 在这个例子中,虽然ba原创 2011-10-29 14:39:21 · 1712 阅读 · 0 评论 -
C++的 RTTI 概念和用途
自从1993年Bjarne Stroustrup 〔注1 〕提出有关C++ 的RTTI功能之建议﹐以及C++的异常处理(exception handling)需要RTTI;最近新推出的C++ 或多或少已提供RTTI。 然而,若不小心使用RTTI,可能会导致软件弹性的降低。本文将介绍RTTI的观念和近况﹐并说明如何善用它。 什么是RTTI? 在C++ 环境中﹐头文件(he原创 2011-10-29 14:41:20 · 1323 阅读 · 0 评论 -
深入理解C++中的mutable关键字
mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 他只能用于类的非静态和非常量数据成员 我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对原创 2011-10-29 14:44:16 · 1399 阅读 · 0 评论 -
可重入函数
可重入函数主要用于多任务环境中,一个可重入的函数简单来说就是可以被中断的函数,也就是说,可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。可重入函数简介 也可以这样理解,重入即表示原创 2011-10-29 14:48:11 · 1900 阅读 · 1 评论 -
为什么C++编译器不能支持对模板的分离式编译
首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文件)文件格式,并且本身包含的就已经是二进制码,但是不一定能够执行,因为并不保证原创 2011-11-01 09:01:59 · 1415 阅读 · 0 评论 -
常用字符串编码转换的函数
#include windows.h>#include string>/// @brief ascii和unicode之间的编码转换 size_t ascii_to_unicode(const char* src, wchar_t* dest, size_t dest_len, size_t src_len = 0){ if(src_len == 0) src_l原创 2011-11-22 16:40:49 · 1757 阅读 · 0 评论 -
继承中构造函数和析构函数地调用顺序
现在,有三个类,类的定义如下class CA{public: CA(){cout ~CA(){cout};class CB:public CA{public: CB(){cout ~CB(){cout};class CC:public CB{public: CC(){cout ~CC()原创 2011-11-02 15:28:51 · 6455 阅读 · 7 评论 -
C++默认参数与函数重载 注意事项
一、默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。注意:(1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在函数定义中设定。(#add ,此句意原创 2011-11-02 15:24:45 · 11567 阅读 · 0 评论 -
C++中 const的用法
举一个简单的例子int & B(int &n){ n++; return n;}int main(){ int a = 10; int & b = B(a); // 调用 B, 传递的是 a 的引用 // 到了 B 里, n 就是指 a, // return n; 就相当是 return a; // 返回到 b 的就是 a 的引用,原创 2011-11-02 15:20:28 · 1364 阅读 · 0 评论 -
C++模板使用介绍
概览:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同原创 2011-11-02 15:21:43 · 2342 阅读 · 0 评论 -
C++垃圾回收器的实现(附auto_ptr 与CComPtr区别)
一、简介这是一个自己写C++垃圾自动回收器,用到的都是标准C++语法。采用了引用计数加mark-sweep的方法。在没有循环引用的情况下,引用计数可以保证垃圾实时得到回收;对于有循环引用的情况下,计数就不能回收了,这时就要用mark-sweep的方法。其实完全使用mark- sweep的方法也是可以的,但有了引用计数,可以回收大量的非循环引用垃圾,减少最后的mark-sweep时的工作量。原创 2011-11-08 18:27:29 · 3074 阅读 · 4 评论 -
C输出格式总结
C输出格式总结2007-07-08 12:091 一般格式 printf(格式控制,输出表列) 例如:printf("i=%d,ch=%c/n",i,ch); 说明: (1)“格式控制”是用双撇号括起来的字符串,也称“转换控制字符串”,它包括两种信息: ①格式说明:由“%”和格式字符组成,它的作用是将输出的数据转换为指原创 2010-05-11 15:27:00 · 1136 阅读 · 0 评论 -
placement new的用法
placement new是重载operator new的一个标准、全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本)。它的原型如下:void *operator new( size_t, void *p ) throw() { return p;}原创 2011-11-02 15:26:21 · 2379 阅读 · 0 评论 -
回调函数(__stdcall)
2 过程语言中的回调(C)2.1 函数指针回调在C语言中是通过函数指针来实现的,通过将回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子:void Func(char *s);// 函数原型void (*pFunc) (char *);//函数指针可以看出,函数的定义和函数指针的定义非常类似。 一般的化,为了简化函数指针类型的原创 2010-02-09 15:39:00 · 3816 阅读 · 0 评论 -
模板的一些高级主题
十一、模板与继承1、当从模板类派生出子类时必须注意的是:子类并不会从通用的模板基类继承而来,只能从基类的某一实例继承而来。这样的话就有以下几种继承方式: a、基类是模板类的一个特定实例版本,比如template class B : public A{}; b、基类是一个和子类相关的一个实例,比如template class B : public A{};原创 2011-10-19 22:23:34 · 1553 阅读 · 0 评论 -
C++枚举类型
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举类型来表示它!enum box{pencil,pen};/原创 2011-12-27 16:46:54 · 1367 阅读 · 0 评论 -
C++委托简介
委托就是把具体事情让别人做,我只调用你的函数。下面是一个例子:class RealSort{public:void sort();};class MySort{private:RealSort rs;public:SetName(RealSort rs){ this->rs = rs;}void sort()原创 2011-10-29 14:37:05 · 2647 阅读 · 0 评论 -
特化和偏特化
Partial Template Specialization能够让你在模板(Template)的所有可能的实体中特化出一组子集. 1.模板的特化(template specialization): 例如,定义如下的一个模板: template class Widget { ... 泛化实现代码 ... }; 然后原创 2012-01-12 23:02:58 · 1648 阅读 · 0 评论 -
C++成员初始化列表
类对象的构造顺序是这样的:1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 初始化阶段可以是显式的或隐式的,取决于是否存在成员初始化表。隐式初始化阶段按照声明的顺序依次调用所有基类的缺省构造函数,然后是所有成员类对象的缺省构造函数。2.进入构造函数后在构造函数中执行一般计算 计算阶段由构造函数体内的所有语句构成。在计算阶段中,数据成员的设置被认原创 2009-11-28 17:46:00 · 1933 阅读 · 0 评论 -
特殊的运算符重载-----类型转换运算符重载
在C++中有一个特殊的运算符重载方法--类型转换运算符重载,形如:operator type(); type可以是基本类型,也可是类类型。/** type_conv.cpp** Created on: 2009-8-14* Author: kwarph* Mail: kwarph@gmail.com*/#include using namespace std;cl原创 2009-11-23 10:20:00 · 1994 阅读 · 0 评论 -
前置++为什么比后置++效率高
前置++:type operator++(); 后置++:const type operator++(int ); 为了编译器区分前置和后置++,C++规定后缀形式有一个int类型参数 ,当函数被调用时,编译器传递一个0做为int参数的值给该函数。不这样规定,无法区分,因为都仅以自身对象为入参。 下面是一个简单的例子: class CIn原创 2009-10-09 10:00:00 · 2044 阅读 · 1 评论 -
C++批判(1)
以下文章翻译自Ian Joyner所著的《C++?? A Critique of C++ and Programming and Language Trends of the 1990s》 3/E【Ian Joyner 1996】该篇文章已经包含在Ian Joyner所写的《Objects Unencapsulated 》一书中(目前已经有了日文的翻译版本),该书的介绍可参见于:h原创 2011-12-28 15:26:44 · 1289 阅读 · 0 评论 -
两种实现数据交换的宏定义
#define swap(x,y) {int temp=x;x=y;y=temp;}//换行写法#define swap(x, y)\int temp = x;\x = y;\y = temp;#define swap(x,y) {x= x+y;y=x-y;x=x-y;}//换行写法#define swap(x,y)\x=x+y;\y=x-y;\原创 2009-09-28 10:38:00 · 3109 阅读 · 2 评论 -
c语言及c++若干注意事项(逐步添加)
一:宏定义不能换行,若要换行须用换行符\运算符重载:结论1:对二元运算符,将它重载为一个友元函数比重载为一个成员函数要便于使用。以支持交换率作为一个友元函数,二元运算符不要求第一个参数一定为某类的对象。结论2:对一元运算符,将它重载为一个成员函数最恰当。重载为友员函数也可以。妙招:给指针变量取别名 char a = 'M'; char *p = &a; char *原创 2009-09-21 23:39:00 · 1444 阅读 · 0 评论 -
函数名修饰和调用规则
“C”或者“C++”函数在内部(编译和链接)通过修饰名识别。修饰名是编译器在编译函数定义或者原型时生成的字 符串。有些情况下使用函数的修饰名是必要的,如在模块定义文件里头指定输出“C++”重载函数、构造函数、析构函数,又如在汇编代码里调用“C””或“C ++”函数等。修饰名由函数名、类名、调用约定、返回类型、参数等共同决定。调用约定调用约定(Calling conven原创 2011-12-30 11:11:36 · 2392 阅读 · 0 评论