![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++语言编程
文章平均质量分 76
百云在飘
这个作者很懒,什么都没留下…
展开
-
函数调用传值、传地址与引用的选择
函数调用传值、传地址与引用的选择原创 2010-08-29 01:59:00 · 1568 阅读 · 0 评论 -
no matching function for call to ‘transform
文章得从《C++标准程序库》中的一个源代码说起。今天看到了第11章String,于是敲了书上的源代码,在Ubuntu下一编译,靠,竟然报错了。 STL报错那是什么概念……信息异常混乱啊!于是就直接去Google搜索错误提示关键字了。恩,找到了相关问题,同样也是《C++标准程序库》上的这份代码造成的。 现来看一下代码吧: 错误提示如下: toLower.cpp: In function ‘int main()’: toLower.cpp:28: error: no matching functio原创 2011-05-08 17:35:00 · 2393 阅读 · 1 评论 -
C++ 多重继承
一、单继承存在的问题 假设你使用Animal类已经有一段时间后,并将类层次结构分为了鸟类和哺乳动物。Bird类包括成员函数fly,从Mammal类派生出了Horse类,Horse类包括成员函数whinny和gallop. 现在需要一个飞马对象Pegasus:一种介于马和鸟之间的动物。它可能包含成员函数fly和whinny。这是使用单继承就会陷入困境。 第一种解决方法:从Horse类派生出Pegasus,将fly复制到Pegasus中。这样不得不使维护人员修改fly,需原创 2011-03-17 16:53:00 · 927 阅读 · 0 评论 -
C++ 抽象数据类型 纯虚函数
在抽象类中,接口表示一种概念(如形状)而不是具体的对象(如圆)。 在C++中,抽象类只能用作其他类的基类,不能创建抽象类的实例。 一、纯虚函数 C++通过提供纯虚函数来支持创建抽象类。通过初始化虚函数为0,来将其声明为纯虚的: virtual void Draw () = 0; 在这个例子中,类有一个Draw函数,但其实现为空,因此不能被调用。 只要任何一个函数被声明为纯虚函数,这个类就是抽象类。 将纯虚函数放在类中,需做到两点原创 2011-03-18 10:17:00 · 850 阅读 · 0 评论 -
如何在linux下检测内存泄漏
本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨。其中包括 C++ 中的 new 和 delete 的基本原理,内存检测子系统的实现原理和具体方法,以及内存泄漏检测的高级话题。作为内存检测子系统实现的一部分,提供了一个具有更好的使用特性的互斥体(Mutex)类。转载 2011-03-16 14:50:00 · 621 阅读 · 0 评论 -
内存调试技巧 C 语言最大难点揭秘
本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。内存错误是 C 和 C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划。但好消息是,它们并不怎么神秘。转载 2011-03-16 15:03:00 · 807 阅读 · 0 评论 -
C++ 读文件,预留空间
<br />用C++ ifstream类读入linux下中文文件,再使用SMTP协议发送出去<br />如果用string类的成员函数reserve一开始预留足够的空间,用outlook收邮件就不会乱码<br />#include <iostream>#include <string>#include <fstream>int main(){ char * filename = "body.txt"; string rtext; size_t fileSize;原创 2011-03-15 16:43:00 · 1332 阅读 · 0 评论 -
C++ 继承
继承是面向对象编程语言的最重要特性之一,正确使用继承方便维护和扩展。 保护类数据和成员方法有三种限定符:public,protected和private。 一、向基类的构造函数传递参数 可以通过在派生类的构造函数名后加冒号,基类名和基类构造函数需要的参数,可以在初始化期间对基类进行初始化。 class CAnimal { public: CAnimal(); CAnimal(int age); ~CAnimal();原创 2011-03-12 18:11:00 · 472 阅读 · 0 评论 -
shared_ptr 两种常见的使用方式 (1)
1. 当作类对象的“共享句柄”来使用 2. 在类内部提供资源管理服务 —— “为类提供资源的共享拷贝语义(或称为浅拷贝shadow copy),并在正确的时间回收资源” 上述的两种方式一种是在类外部使用,一种是在类内部使用,然而这两种方式并不是非此即彼的关系,很多情况下我们都可以选择任意一种,选择其中一种理由通常是遵循“更容易被使用,更难以被误用”的原则。 当作类对象的“共享句柄”来使用 在这种使用方式下,结合Create Method模式使用会取得更好的效果(关于Create Method模式,更转载 2011-03-11 19:12:00 · 2262 阅读 · 0 评论 -
在Linux下使用C++发送中文邮件,而用outlook接收是乱码
1.在Linux下用fstream读取内容为中文的文件,存放在string类中2.在string字符串中,对其进行查找,插入,替换,追加等操作3.把处理好的string字符串,使用smtp协议来发送邮件4.windows机器使用outlook来接收邮件,发现正原创 2011-07-05 20:33:09 · 896 阅读 · 0 评论 -
(Effective C++)第五章 实现(Implementation)
7.1 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)只要你定义一个变量而其类型带有一个构造函数或析构函数,那么当程序的控制流到达这个变量定义式时,你得承受构造成本;当这个变量离开原创 2011-10-15 20:08:40 · 1117 阅读 · 1 评论 -
(Effective C++)第三章 资源管理(Resource Management)
5.1 条款13:以对象管理资源(Use object to manage resource)以对象管理资源。一般情况下,谁申请资源,谁负责释放。如下:class Investment {};void f{ Investment *pInv = ne原创 2011-10-15 19:57:01 · 707 阅读 · 0 评论 -
(Effective C++)第二章 构造、析构和赋值运算(Constructors,Destructors and Assignment Operators)
4.1 条款5:了解C++默认编写并调用哪些函数(Know what functions C++ silently writes and calls)了解C++默默编写并调用哪些函数:如果写下:class Empty{};编译器会产生如下:class原创 2011-10-15 19:51:07 · 723 阅读 · 0 评论 -
Effective C++ 目录
目 录1 让自己习惯C++(View Yourself to C++) 11.1 条款1:视C++为一个语言联邦(View C++ as a federation of language) 11.2 条款2:尽量使用consts,enums和inlines原创 2011-10-15 20:37:30 · 1789 阅读 · 0 评论 -
(Effective C++)第一章 让自己习惯C++(View Yourself to C++)
1.1 条款1:视C++为一个语言联邦(View C++ as a federation of language)C++主要的次语言(sublanguage):l 【3-1-1】 说到底C++仍是以C为基础。区块(blocks),语句 (statements),预处理器原创 2011-10-15 19:33:11 · 737 阅读 · 0 评论 -
(Effective C++)第八章 定制new和delete(Customizing new and delete)
10.1 条款49:了解new-handler行为 (Understand the behavior of the new-handler)当operator new抛出异常以反映一个未获满足的内存需求之前,它会调用一个客户指定的错误处理函数,一个所谓的new-handler原创 2011-10-15 20:33:05 · 877 阅读 · 0 评论 -
(Effective C++)第四章 设计与声明(Design and declaration)
6.1 条款18:让接口容易被正确使用,不易被误用(Make interfaces easy to use correctly and hard to use incorrectly)条款13表明客户把新申请的资源置入智能指针中,以免资源泄露。而std::tr1::share原创 2011-10-15 20:03:40 · 664 阅读 · 0 评论 -
(Effective C++)第六章 继承与面向对象(Inheritance and Object-Oriented Design)
Public继承意味着“is-a”,virtual函数意味着“必须被继承”,non-virtual意味着“接口和实现都必须被继承”。8.1 条款32:确定你的public继承塑模出is-a关系 (Make sure public inheritance models “is-原创 2011-10-15 20:14:24 · 1167 阅读 · 0 评论 -
(Effective C++)第七章 模板与泛型编程 (Templates and Generic Programming)
C++template机制自身是一部完整的图灵机(Turing-complete):它可以被用来计算任何可计算的值。于是导出了模板元编程(templatemetaprogramming),创造出“在C++编译器内执行并于编译完成时停止执行”的程序。9.1 条款41:了解隐式接原创 2011-10-15 20:30:06 · 1033 阅读 · 0 评论 -
auto_ptr与shared_ptr --- shared_ptr (2)
shared_ptr shared_ptr是Boost库所提供的一个智能指针的实现,正如其名字所蕴意的一样: An important goal of shared_ptr is to provide a standard shared-ownership pointer. shared_ptr的一个重要目的就是为了提供一个标准的共享所有权的智能指针。 —— Boost库文档 没错,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的转载 2011-03-11 19:09:00 · 787 阅读 · 1 评论 -
综合使用map和set
代码示例: [root@local~ work]# g++ mapset.cpp [root@local~ work]# ./a.out wuzhenghua beijing wuzhenghua shenzhen wuzhenghua shenzhen原创 2011-03-11 17:19:00 · 579 阅读 · 0 评论 -
c++ 修改stl set中的元素
set的迭代器it有const修饰符,那么对它元素的修改就必然不能成功了。但是有时候遇到要修改stl set元素的问题,这个问题一般的解决方法是先erase这个元素,然后再insert,这样效率很低,所以得找更有效的方法,开始的时候编译始终通不过。如果利用const_cast(*it)把it映射成一个引用的对象,那么就可以对它进行修改了。更加通用的方法如下: 参考: effective STL 条款22:避免原地修改set和multiset的键原创 2011-03-04 20:18:00 · 8274 阅读 · 0 评论 -
STL SET 类 排序
#include #include #include using namespace std; class CEmployee { public: CEmployee(); ~CEmployee(); const string getName() const; void setName(const string name); const string getTitle() const;原创 2011-03-04 19:44:00 · 1253 阅读 · 0 评论 -
STL map 按值排序
在STL中,map是按键来排序的,但很多时候需要按值来排序。一种方法是将map转化为vector,然后排序。 #include #include #include #include #include using namespace std; void sortMapByValue(map& tMap,vector >& tVector); int cmp(const pair& x,const pair& y) { return x.secon转载 2011-03-02 10:35:00 · 2664 阅读 · 0 评论 -
STL map 排序(重载小于号和仿函数)
STL中默认是采用小于号来排序的,以上代码在排序上是不存在任何问题的,因为上面的关键字是int型,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数在编译的时候过不去,下面给出两个方法解决这个问题 第一种:小于号重载,程序举例 #include #include #include using namespace std; typedef struct tagStudentInfo {原创 2011-03-02 10:18:00 · 8182 阅读 · 1 评论 -
STL map
一.map Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的. 二.构造函数 map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表。通常用如下方法原创 2011-03-02 09:47:00 · 661 阅读 · 0 评论 -
C++中string类
一.string本质 其实,string并不是一个单独的容器,只是basic_string 模板类的一个typedef 而已,相对应的还有wstring, 你在string 头文件中你会发现下面的代码: extern "C++" { typedef basic_string string; typedef basic_string wstring; } // extern "C++" 二.构造字符串原创 2011-03-01 19:02:00 · 664 阅读 · 0 评论 -
什么是MinGW
1 引子 C++程序的执行过程:一般来说C++程序的执行过程可以分为两步:第一步将.cpp源文件编译成对象文件,第二步将对象文件链接成为可执行文件。(具体来说,编译过程还可细分为两个阶段:预处理阶段和编译阶段)。 根据上述的程序执行过程我们可以知道在执行过程中需要有编译器和链接器。而我们还需要在文本编辑器中编写程序的源代码,以及调试程序所需的调试器等,将所有的这些集中在一起就形成了IDE(集成开发环境)。IDE是一种辅助开发人员进行开发的应用软件。利用IDE,你可以完成编码,调试,运行这一系列的过程。而原创 2010-12-29 05:31:00 · 2175 阅读 · 0 评论 -
VC中cl.exe命令参数详解
CL.exe 是控制 Microsoft C 和 C++ 编译器与链接器的 32 位工具。编译器产生通用对象文件格式 (COFF) 对象 (.obj) 文件。链接器产生可执行文件 (.exe) 或动态链接库文件 (DLL)。 注意,所有编译器选项都区分大小写。 若要编译但不链接,请使用 /c。 使用 NMAKE 生成输出文件。 使用 BSCMAKE 支持类浏览。 以下是一个完整的编译器选项分类列表。 优化 选项 作用 /O1 创建小代码原创 2010-12-29 05:08:00 · 886 阅读 · 0 评论 -
C++库大全
基础类 1、 Dinkumware C++ Library 参考站点:http://www.dinkumware.com P.J. Plauger编写的高品质的标准库。P.J. Plauger博士是Dr. Dobb's程序设计杰出奖的获得者。其编写的库长期被Microsoft采用,并且最近Borland也取得了其OEM的license,在其C/C+ +的产品中采用Dinkumware的库。 2、 RogueWave Standard C++ Library 参考站点:http://w转载 2011-02-15 14:28:00 · 712 阅读 · 0 评论 -
经典C++库
1、系统和网络编程库:ACE 除了ACE之外,还有很多系统和网络编程方面的程序库。比如在线程库方面,还有ZThread、boost::thread,如果放大到C/C++领域,还有APR,还有CII。在文件和目录操作方面,boost也有相应的组件,而在网络编程方面有socket++,还有boost::asio,未来的 C++0X中几乎肯定有一个网络编程和一个线程库。然而目前看来,ACE仍然是进行系统和高性能网络编程的首选,其地位在一段时间内不会被撼动。它不但是一个实用的程序库、框架集,还是一个典转载 2011-02-15 14:29:00 · 1170 阅读 · 0 评论 -
C++ 基类调用派生类非虚函数
<br />#include <iostream>#include <string>using namespace std;class CAnimal{ public: CAnimal(){cout<< "animal constructor" <<endl;} virtual ~CAnimal(){cout<< "animal destructor" <<endl;} virtual void speek() const{cout<< "animal原创 2011-03-13 18:09:00 · 1444 阅读 · 0 评论 -
C++ 类型转换
一、static_cast static_cast用于在相关类型的指针之间进行转换,还可以显式地指向标准数据类型的类型转换。用于指针时,static_cast实现了基本的编译阶段检查,确保指针被转换为相关类型。在C语言中,可将一个对象的指针转换为完全不相关的类型,而编译器也不会报错。使用static_cast可将指针向上转换为基类类型,也可向下转为派生类型。 CAnimal *pBase = new CDog; CDog* pDog = static_cast(pBa原创 2011-03-13 18:04:00 · 556 阅读 · 0 评论 -
C++ 虚函数
一、虚方法 C++不将允许CDog对象继承了基类的属性(数据)和功能(方法),然而C++还扩展了其多态性。也就是,允许将派生类对象赋值给指向基类的指针。 CAnimal *panimal=new CDlog; 然后可以通过这个指针来调用CAnimal类的任何方法。虚函数就可以做到这点。 二、虚函数工作原理 创建派生对象时,首先调用基类的构造函数,然后调用派生类的构造函数。下图说明了CDog对象被创建后的情景,注意CAnimal部分和CDog部分在内存中原创 2011-03-13 15:38:00 · 688 阅读 · 0 评论 -
auto_ptr与shared_ptr --- auto_ptr (1)
这篇文章试图说明如何使用auto_ptr和shared_ptr,从而使得动态分配对象的使用和管理更安全,方便。除了一般的使用说明外,更主要是说明它们之间的异同 —— 满足需求的不同和开销上的差异。 文章的多数知识都来源于: 1. Exceptional C++(Herb)Item 37 auto_ptr 2. Exceptional C++ Style(Herb)和C++ Coding Standard(Herb,Andrei)其中一些关于使用shared_ptr的论述 3. GC++和VC++ 8转载 2011-03-11 19:06:00 · 503 阅读 · 0 评论 -
STL list
一、概述 list是一个双向链表,空间不再连续,它的好处是每次插入或删除一个元素,就配置或释放一个元素空间。 list迭代器必须由能力指向list的节点,进行正确的递增,递减,取值,成员存取等操作。 List有一个重要的性质:插入(insert),接洽(splice) 和删除(erase)都不会造成原有的list迭代器失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原来的迭代器全部失效。 slist是单链表,具有list同样重要的性质。根据ST原创 2011-03-05 17:15:00 · 708 阅读 · 0 评论 -
使用引用
一、什么是引用 引用是别名,创建引用时,务必要初始化为另一个对象,不能为空。 int &rSomeRef = someInt; 对rSomeRef的操作实际上就是对someInt的操作。 rSomeRef = 7; //somInt = 7 不能给引用重新赋值。 int someTwo = 9; rSomeRef = someTwo; //实际上rSomeRef还是指向的是someInt这个对象。 指针可以为空,但是引用不能为空。原创 2011-03-08 10:31:00 · 526 阅读 · 0 评论 -
STL vector
一、概述 vector是一个模板类,提供了动态数组的通用功能,特点如下: 1. 在数组末尾添加或删除元素所需的时间是固定的 2. 在数组中间添加或删除元素所需要的时间与该元素后面的元素个数成正比 3. 存储的元素是动态的。 二、示例化 vector vecArray; // Instantiate a vector with 10 elements (it can grow larger) vector vecArrayWithTenEl原创 2011-03-05 15:26:00 · 632 阅读 · 0 评论 -
C++二级指针与引用
先来看一段代码,功能是实现IP的统计,如果一个IP出现三次就触发相应的处理,但是每个Ip统计始终为1,具体如下,EdgeMonitor.h#include #include #include #include #include using namespace std;#define EDGE_DEBUG#ifdef EDGE_DEBUG#define DBG_LOG原创 2011-11-15 13:51:31 · 1356 阅读 · 0 评论