![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 53
Study_2011
这个作者很懒,什么都没留下…
展开
-
用GDB调试程序(二)
GDB的命令概貌———————启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> gdb GNU gdb 5.1.1 Copyright 2002 Free Software Foundation, Inc. GDB is free sof转载 2015-01-14 17:02:26 · 650 阅读 · 0 评论 -
iomanip
在c++程序里面经常见到下面的头文件#include io代表输入输出,manip是manipulator(操纵器)的缩写(在c++上只能通过输入缩写才有效。)iomanip的作用:主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样.以下是一些常见的控制函数的:转载 2013-09-22 08:47:37 · 1202 阅读 · 0 评论 -
白话经典算法系列之七 堆与堆排序
堆排序与快速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法。学习堆排序前,先讲解下什么是数据结构中的二叉堆。二叉堆的定义二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个转载 2013-09-21 23:58:48 · 767 阅读 · 0 评论 -
C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。静态成员的定义或声明要加个关键static。静态成员可以通过双冒号来使用即::。 在C++中类的静态成员变量和静态成员函数是个容易出错的地方,本文先通过几个例子来总结静态成员变转载 2013-09-22 10:58:00 · 549 阅读 · 0 评论 -
子类重载父类的虚函数
/* 如果派生类不止派生了与基类虚函数相同类型的参数, 还重载了该函数的情况验证。 结论:子类调用时可以通过参数类型来判断调用那个成员函数,相当于普通函数的重载 父类指针实现多态还是可以的,只是只能调用那个参数类型与父类虚函数参数类型相同的函数*/#include using namespace std;class CBase原创 2013-09-21 23:40:49 · 1970 阅读 · 0 评论 -
素数
埃拉托斯特尼筛法一、简介 埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由埃及数学家埃拉托斯特尼所提出的一种简单检定素数的算法。编辑本段二、步骤 我们详细列出算法如下: 第一步,列出如下这样以2开头的序列: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25转载 2013-09-21 23:13:33 · 747 阅读 · 0 评论 -
C++ union结构
C++ union结构式一种特殊的类。它能够包含访问权限、成员变量、成员函数(可以包含构造函数和析构函数)。它不能包含虚函数和静态数据变量。它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来。Union中得默认访问权限是public。在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我转载 2013-10-06 22:41:57 · 765 阅读 · 0 评论 -
成员指针
13.1.9 指向类成员的指针在C++语言中,可以定义一个指针,使其指向类成员或成员函数,然后通过指针来访问类的成员。这包括指向属性成员的指针和指向成员函数的指针。1.指向数据成员的指针在C++语言中,可以定义一个指针,使其指向类成员。当属性成员为静态和非静态时,指针的使用也有不同。其中,指向非静态数据成员的指针定义格式如下:1. 数据类型>类名>::*指针名>[转载 2013-09-20 21:45:29 · 534 阅读 · 0 评论 -
C++模板元编程 入门简介
最近一直在看STL和Boost,源码里边好多涉及到模板元编程技术,简单了解一下,备忘(Boost Python中的涉及模板元的部分重点关注一下)。范例引入// 主模板templateint N>struct Fib{ enum { Result = Fib1>::Result + Fib2>::Result };};// 完全特化版template <转载 2013-10-04 17:09:17 · 824 阅读 · 0 评论 -
C++ 关键字 extern
extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可ex转载 2013-09-19 21:54:26 · 483 阅读 · 0 评论 -
C++_运算符重载
什么是运算符的重载? 运算符与类结合,产生新的含义。 为什么要引入运算符重载? 作用:为了实现类的多态性(多态是指一个函数名有多种含义)怎么实现运算符的重载?方式:类的成员函数 或 友元函数(类外的普通函数)规则:不能重载的运算符有 . 和 .* 和 ?: 和 :: 和 sizeof友元函数和成员函数的使用场合:一般情况下,建议一转载 2013-10-02 22:21:47 · 520 阅读 · 0 评论 -
C++运算符重载
在前一节中曾提到过,C++中运行时的多态性主要是通过虚函数来实现的,而编译时的多态性是由函数重载和运算符重载来实现的。这一系列我将主要讲解C++中有关运算符重载方面的内容。在每一个系列讲解之前,都会有它的一些基础知识需要我们去理解。而运算符重载的基础就是运算符重载函数。所以今天主要讲的是运算符重载函数。 1.运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用域不同类型的数据导致不转载 2013-10-02 19:36:54 · 572 阅读 · 0 评论 -
Socket网络编程常用的结构及函数小结
IP地址的作用是标示计算机的网卡地址,每台计算机都有一个IP地址;端口,是指计算机中为了标示在计算机中访问网络的不同程序而设的编号,并不是网卡接线的端口,而是不同程序的逻辑编号,并不是实际存在的;域名,是用来代替IP地址来标示计算机的一种直观名称,例如百度网站的IP地址是202.108.22.43,这个IP地址没有任何逻辑含义,不便记忆,而www.baidu.com是一个便于记忆的名称,用于代替这转载 2013-09-29 23:07:15 · 597 阅读 · 0 评论 -
互斥量和信号量的区别
1. 互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥转载 2013-09-29 23:37:41 · 621 阅读 · 0 评论 -
c中的字符串函数
字符串拷贝题目描述:要求实现库函数strcpy,原型声明:extern char *strcpy(char *dest,char *src); 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 分析:如果编写一个标准s转载 2013-09-12 23:56:15 · 679 阅读 · 0 评论 -
dynamic_cast的用法
/*这是从网上摘下的例子,主要讲述了 dynamic_cast/* 作用:将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理, 即会作一定的判断。 对指针进行dynamic_cast,失败返回null,成功返回正常cast后的对象指针; 对引用进行dynamic_c转载 2013-09-23 23:28:05 · 650 阅读 · 0 评论 -
实现自己的变参函数printf
在c/c++标准库中,变参函数很特别。printf, fprintf, sprintf等都属于变参函数。如果自己要写类似的参数可变的函数,通常会用到下面三个函数:#include stdarg.h> void va_start(va_list ap, last); type va_arg(va_list ap, type);转载 2013-10-12 10:37:02 · 791 阅读 · 0 评论 -
申请不同对象调用拷贝构造函数还是默认构造函数
笔试遇到一个问申请对象调用的是拷贝构造函数还是默认构造函数的问题,研究了一下。原始代码/*几种类型申请数据构造函数的调用*/#include #include using namespace std;class ctest{static int defconstruct;//用于保存默认构造函数的调用次数static int copyconstruct;//用于保存co原创 2013-10-12 13:01:11 · 886 阅读 · 0 评论 -
用GDB调试程序(一)
用GDB调试程序GDB概述————GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理。一般来说,GDB主要帮忙你完成下面四个方面的功能: 1、启动你的转载 2015-01-14 16:59:11 · 661 阅读 · 0 评论 -
C++成员的初始化规则
可以认为构造函数分两个阶段执行:(1)初始化阶段;(2)普通的计算阶段。计算阶段由构造函数函数体中的所有语句组成。不管成员是否在构造函数初始化列表中显式初始化,类类型的数据成员总是在初始化阶段初始化。初始化发生在计算阶段开始之前。在构造函数初始化列表中没有显式提及的每个成员,使用与初始化变量相同的规则来进行初始化。运行该类型的默认构造函数,来初始化类类型的数据成员。内置或复合类型的成员的初原创 2014-01-03 20:26:00 · 743 阅读 · 0 评论 -
检查 new 的返回值
我们都知道,使用 malloc/calloc 等分配内存的函数时,一定要检查其返回值是否为“空指针”(亦即检查分配内存的操作是否成功),这是良好的编程习惯,也是编写可靠程序所必需的。但是,如果你简单地把这一招应用到 new 上,那可就不一定正确了。我经常看到类似这样的代码: int* p = new int[SIZE]; if ( p == 0 ) //转载 2013-12-19 23:31:25 · 738 阅读 · 0 评论 -
C++static 数据成员
static 数据成员可以声明为任意类型,可以是常量、引用、数组、类类型,等等。static 数据成员必须在类定义体的外部定义(类的内部为声明)。不像普通数据成员,static 成员不是通过类构造函数进行初始化,而是应该在定义时进行初始化。定义 static 数据成员的方式与定义其他类成员和变量的方式相同:先指定类型名,接着是成员的完全限定名。一般而言,类的 static 成员,像普通原创 2014-01-03 20:50:05 · 648 阅读 · 0 评论 -
设计模式C++实现(3)——适配器模式
DP(《设计模式:可复用面向对象软件的基础》)上的定义:适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。它包括类适配器和对象适配器,本文针对的是对象适配器。举个例子,在STL中就用到了适配器模式。STL实现了一种数据结构,称为双端队列(deque),支持前后两段的插入与删除。STL实现栈和队列时,没有从头开始定义它们,而是直接使用双端转载 2013-10-28 11:17:51 · 650 阅读 · 0 评论 -
设计模式C++实现(2)——策略模式
策略模式是指定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也就是说这些算法所完成的功能一样,对外的接口一样,只是各自实现上存在差异。用策略模式来封装算法,效果比较好。下面以高速缓存(Cache)的替换算法为例,实现策略模式。 什么是Cache的替换算法呢?简单解释一下, 当发生Cache缺失时,Cache控制器必须选转载 2013-10-28 11:14:08 · 678 阅读 · 0 评论 -
设计模式C++实现(4)——单例模式
单例的一般实现比较简单,下面是代码和UML图。由于构造函数是私有的,因此无法通过构造函数实例化,唯一的方法就是通过调用静态函数GetInstance。 UML图: 代码:[cpp] view plaincopyprint?//Singleton.h class Singleton {转载 2013-10-28 11:27:03 · 549 阅读 · 0 评论 -
设计模式C++实现(1)——工厂模式
工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。听上去差不多,都是工厂模式。下面一个个介绍,首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。有点抽象,举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出转载 2013-10-28 11:02:45 · 725 阅读 · 0 评论 -
C++多重继承和虚继承的内存布局
这篇文章主要讲解虚继承的C++对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别、虚函数表的格式等一些大部分C++程序员都似是而非的概念。原文见这里(By Edsko de Vries, January 2006)敬告: 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识。本文我们将阐释GCC编译器针对多重转载 2013-10-17 21:10:53 · 737 阅读 · 0 评论 -
Linux系统网络服务器模型
Linux系统网络服务器模型主要有两种:并发服务器和循环服务器。所谓并发服务器就是在同一个时刻可以处理来自多个客户端的请求;循环服务器是指服务器在同一时刻指可以响应一个客户端的请求。而且对于TCP和UDP套接字,这两种服务器的实现方式也有不同的特点。 1、TCP循环服务器:首先TCP服务器接受一个客户端的连接请求,处理连接请求,在完成这个客户端的所有请求后断开连接,然后再接转载 2013-10-17 08:24:12 · 692 阅读 · 0 评论 -
在 Linux 平台中调试 C/C++ 内存泄漏方法
由于 C 和 C++ 程序中完全由程序员自主申请和释放内存,稍不注意,就会在系统中导入内存错误。同时,内存错误往往非常严重,一般会带来诸如系统崩溃,内存耗尽这样严重的后果。从历史上看,来自计算机应急响应小组和供应商的许多最严重的安全公告都是由简单的内存错误造成的。自从 70 年代末期以来,C/C++ 程序员就一直讨论此类错误,但其影响在 2007 年仍然很大。与许多其他类型的常见错误不同,内存错误转载 2013-10-17 08:22:07 · 862 阅读 · 0 评论 -
海量数据面试题整理
1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。s 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(记为)中。这样每个小文件的大约为300转载 2013-10-17 08:27:39 · 776 阅读 · 0 评论 -
数组指针和指针数组
这两个名字不同当然所代表的意思也就不同。我刚开始看到这就吓到了,主要是中文太博大精深了,整这样的简称太专业了,把人都绕晕了。从英文解释或中文全称看就比较容易理解。指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针数组指针:a pointer to an array,即指向数组的指针还要注意的是他们用法的区别,下面举例说明。in转载 2013-10-15 10:05:17 · 521 阅读 · 0 评论 -
接口继承与实现继承
所谓接口继承,就是派生类只继承函数的接口,也就是声明;而实现继承,就是派生类同时继承函数的接口和实现。我们都很清楚C++中有几个基本的概念,虚函数、纯虚函数、非虚函数。虚函数:虚函数是指一个类中你希望重载的成员函数,当你用一个基类指针或引用指向一个继承类对象的时候,你调用一个虚函数,实际调用的是继承类的版本。——MSDN虚函数用来表现基类和派生类的成员函数之间的一种转载 2013-10-15 09:25:03 · 850 阅读 · 0 评论 -
overload和override的区别
overload和override的区别override(重写) 1、方法名、参数、返回值相同。2、子类方法不能缩小父类方法的访问权限。3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。4、存在于父类和子类之间。5、方法被定义为final不能被重写。overload(重载)1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回转载 2013-09-12 20:05:51 · 551 阅读 · 0 评论 -
C++数组
1.特殊的字符数组char ca1[] = {'C', '+' , '+'}; //no nullchar ca2[] = {'C', '+' , '+', '\0'}; //explicit nullchar ca3[] = "C++";// null terminator added automaticallyca1的维数为3,而ca2和ca3的维数则是4.2.数组形参原创 2013-09-11 23:40:24 · 540 阅读 · 0 评论 -
Linux静态库和动态库学习总结
一、废话之前由于工作需要,要封装一个Linux加密解密转换的动态库,这个之前只做过Windows下面的,Linux下面还真没有做过,之后做了整一个晚上才算做好,不过其中也学到了不少东西,包括Linux下的动态库和静态库,MakeFile等等。之前就已经写了一个练习,之后怕又忘了,总结一下备忘,以后也好查。很大部分内容都是收集的一些东西还有自己学习的体会,有什转载 2013-04-15 15:49:48 · 572 阅读 · 0 评论 -
Linux程序设计之库
1.linux程序的静态库第一个函数源文件f1.cpp#include void f1(const char* str){ std::cout<<str<<std::endl;}第二个函数的源文件f2.cpp#include void f2(const int arg){ std::cout<<arg<<std::endl;}定义一个头文件l原创 2013-04-15 15:37:41 · 601 阅读 · 0 评论 -
C++学习笔记之I/O库
国际字符的支持所描述的流类(stream class)读写的是由 char 类型组成的流。此外,标准库还定义了一组相关的类型,支持wchar_t 类型。每个类都加上“w”前缀,以此与 char 类型的版本区分开来。于是,wostream、wistream 和wiostream 类型从控制窗口读写 wchar_t 数据。相应的文件输入输出类是 wifstream、wofstream 和转载 2013-04-01 19:59:33 · 616 阅读 · 0 评论 -
C++学习笔记之形参
非引用形参const形参在调用函数时,如果该函数使用非引用的非const 形参,则既可给该函数传递const 实参也可传递非const 的实参。这种行为源于 const 对象的标准初始化规则。因为初始化复制了初始化式的值,所以可用const 对象初始化非const 对象,反之亦然。如果将形参定义为非引用的const 类型:void fcn(const int i转载 2013-03-31 22:05:40 · 797 阅读 · 0 评论 -
C++学习笔记之函数返回值
主函数 main 的返回值返回类型不是 void 的函数必须返回一个值,但此规则有一个例外情况:允许主函数main 没有返回值就可结束。如果程序控制执行到主函数main 的最后一个语句都还没有返回,那么编译器会隐式地插入返回 0 的语句。关于主函数 main 返回的另一个特别之处在于如何处理它的返回值。在第 1.1 节已知,可将主函数main 返回的值视为状态指示器。返回 0原创 2013-03-31 22:27:50 · 891 阅读 · 0 评论 -
C++学习笔记之指向函数的指针
指向函数的指针函数指针是指指向函数而非指向对象的指针。像其他指针一样,函数指针也指向某个特定的类型。函数类型由其返回类型以及形参表确定,而与函数名无关: // pf points to function returning bool that takes two const string references bool (*pf)(const string &, co原创 2013-04-01 15:30:00 · 637 阅读 · 0 评论