C++
ZhikangFu
这个作者很懒,什么都没留下…
展开
-
函数指针及其的运用(上)——何为函数指针
=========================引子========================= 我们都知道,数组名就是指向数组第一个元素的常量指针(详见《数组拾遗》)。同理,对于一个函数而言,函数名也是指向函数第一条指令的常量指针。而编译器要做的就是在程序编译之后,为每个函数分配一个首地址,即该函数第一条指令的地址。一般情况下,我们可以用一个指针来保存这个地址,而这个指原创 2016-08-16 10:46:49 · 952 阅读 · 0 评论 -
C++拷贝构造函数详解
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:[c-sharp] view plain copyint a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。[c-转载 2016-05-05 18:38:17 · 457 阅读 · 0 评论 -
【C/C++】计时函数比较
转载:http://www.cnblogs.com/dwdxdy/p/3214905.html目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录. 方法1,time()获取转载 2016-04-11 17:58:09 · 439 阅读 · 0 评论 -
常用排序算法稳定性、时间复杂度分析(转,有改动)
1、 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。2、研究排序算法的稳定性有何意义? 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前两个相等的数据其在序列中的先后位置顺序与排序后它们两个先后位置顺序相同。再简单具体一点,如果A i == A j,Ai 原转载 2015-08-17 19:48:51 · 514 阅读 · 0 评论 -
c++ list, vector, map, set 区别与用法比较
List封装了链表,Vector封装了数组, list和vector得最主要的区别在于vector使用连续内存存储的,他支持[]运算符,而list是以链表形式实现的,不支持[]。Vector对于随机访问的速度很快,但是对于插入尤其是在头部插入元素速度很慢,在尾部插入速度很快。List对于随机访问速度慢得多,因为可能要遍历整个链表才能做到,但是对于插入就快的多了,不需要拷贝和移动数据,只需要原创 2015-09-11 13:55:52 · 1036 阅读 · 0 评论 -
STL map与Boost unordered_map
今天看到 boost::unordered_map, 它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。而boost::unordered_map是计算元素的Hash值,根据Has转载 2015-12-05 12:06:05 · 429 阅读 · 0 评论 -
C++纯虚函数
一、定义 纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion1()=0二、引入原因 1、为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。 2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类原创 2016-04-26 13:27:30 · 444 阅读 · 0 评论 -
struct union enum
一、结构体声明和使用1按照前面简介中的要求我们可以定义如下的结构体完成对一个人各种信息的描述:struct people{ char Name[20]; unsigned int Height; float Weight;};关键字struct表明这是在定义一个结构体,people是这种数据格式的原创 2016-04-25 16:52:30 · 623 阅读 · 0 评论 -
C/C++ volatile让你看的更明白
转载一篇有关C/C++中volatile修饰符的文章,自己用VC++ 10.0测试了一下,与原文有一些不同,特论述如下,让你也让自己看的更明白。链接:http://blog.sina.com.cn/s/blog_4e345ce70100rsc7.html1. 为什么用volatile?C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常转载 2016-04-25 11:43:26 · 398 阅读 · 0 评论 -
C++ const用法 尽可能使用const
http://www.cnblogs.com/xudong-bupt/p/3509567.html C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。1.const 修饰成员变量 1 #include 2 using n转载 2015-06-05 13:55:21 · 611 阅读 · 0 评论 -
C++
1.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?答:首先,extern是C/C++语言中表明函数和全局变量作用范围的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。extern "C"是连接申明(linkage declaration),被转载 2015-09-06 09:52:43 · 509 阅读 · 0 评论 -
C++ 内存的分布
为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码。本文的主要内容如下:源文件转换为可执行文件可执行程序组成及内存布局数据存储类别一个实例总结源文件转换为可执行文件源文件经过以下几步生成可执行文件:1、预处理(preprocessor):对#include、#def原创 2016-06-26 12:08:39 · 421 阅读 · 0 评论 -
C++ 虚函数表解析
转载于:http://blog.csdn.net/haoel/article/details/1948051/前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比转载 2016-06-29 09:16:12 · 301 阅读 · 0 评论 -
c++父类指针指向子类对象
父类子类指针函数调用注意事项1,如果以一个基础类指针指向一个衍生类对象(派生类对象),那么经由该指针只能访问基础类定义的函数(静态联翩)2,如果以一个衍生类指针指向一个基础类对象,必须先做强制转型动作(explicit cast),这种做法很危险,也不符合生活习惯,在程序设计上也会给程序员带来困扰。(一般不会这么去定义)3,如果基础类和衍生类定义了相同名称的成员函数,那么通过对象指针调转载 2016-08-10 08:53:08 · 774 阅读 · 0 评论 -
智能指针的简单总结
1. 智能指针背后的设计思想我们先来看一个简单的例子:void remodel(std::string & str){ std::string * ps = new std::string(str); ... if (weird_thing()) throw exception(); str = *ps; dele原创 2016-07-09 15:52:31 · 1409 阅读 · 0 评论 -
C++函数的返回值——返回引用类型&非引用类型
函数的返回主要分为以下几种情况:1、主函数main的返回值:允许主函数main没有返回值就可结束;可将主函数main返回的值视为状态指示器,返回0表示程序运行成功,其他大部分返回值则表示失败。2、返回非引用类型:函数的返回值用于初始化在调用函数时创建的临时对象(temporary object),如果返回类型不是引用,在调用函数的地方会将函数返回值复制给临时对象。在原创 2016-08-02 08:32:16 · 1216 阅读 · 0 评论 -
C++/C宏定义中## 连接符与# 符的含义
## 连接符号由两个井号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(token)就是指编译器能够识别的最小语法单元。具体的定义在编译原理里有详尽的解释,但不知道也无所谓。同时值得注意的是#连接符是把传递过来的参数当成字符串进行替代。下面来看看它们是怎样工作的。这是MSDN上的一个例子转载 2016-08-16 14:33:07 · 524 阅读 · 0 评论 -
C++中的explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2016-07-20 19:54:39 · 366 阅读 · 0 评论 -
float & double 内存布局
转载http://blog.csdn.net/lai123wei/article/details/7220686C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit,我们在声明一个变量float f= 2.25f的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论转载 2016-07-05 18:37:59 · 408 阅读 · 0 评论 -
C++中 #ifdef 和#endif的作用
一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。 条件编译命令最常见的形式为: #ifdef 标识符 程序段1 #else 程序段2 #endif它的作用是:当标识符已经被定义过(一般转载 2016-07-02 15:27:34 · 367 阅读 · 0 评论 -
c++中try catch的用法
在c++中,可以直接抛出异常之后自己进行捕捉处理,如:(这样就可以在任何自己得到不想要的结果的时候进行中断,比如在进行数据库事务操作的时候,如果某一个语句返回SQL_ERROR则直接抛出异常,在catch块中进行事务回滚)[html] view plain copy#include iostream> #include exception>转载 2016-07-02 10:52:34 · 466 阅读 · 1 评论 -
typedef函数指针用法
转自http://blog.csdn.net/qll125596718/article/details/6891881/1.简单的函数指针的应用形式1:返回类型(*函数名)(参数表) [cpp] view plain copychar (*pFun)(int); char glFun(int a){ return;转载 2016-07-11 08:56:17 · 414 阅读 · 0 评论 -
singleton
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做转载 2016-04-25 09:25:10 · 361 阅读 · 0 评论 -
C++之“友元类”学习笔记
=======================什么是友元类======================= 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问。我们就把类B叫做类A的友元。=======================友元类能做什么======================= 友元类可以通过自己的方法转载 2016-04-25 10:23:28 · 360 阅读 · 0 评论 -
C++的开源跨平台日志库glog学习研究(二)--宏的使用
1. 日志输出宏这里我们以一条最简单的日至输出为例说明:LOG(WARNING) "This is a warning message";这里LOG是一个宏,其定义如下(logging.h line 487):#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()这里根据LOG宏中的sever转载 2015-06-09 10:55:53 · 942 阅读 · 0 评论 -
c++ assert() 使用方法
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:#i转载 2015-06-09 10:51:06 · 393 阅读 · 0 评论 -
C++ this指针的用法
this指针的含义及其用法: 1. this指针是一个隐含于每一个成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。2. 当对一个对象调用成员函数时,编译程序先将对象的地址赋给this指针,然后调用成员函数,每次成员函数存取数据成员时,由隐含使用this指针。3. 当一个成员函数被调用时,自动向它传递一个隐含的参数,该参数是一个指向这个成员函数所在的对象的指针。 4. 在转载 2015-06-09 09:54:59 · 390 阅读 · 0 评论 -
为什么A *a=new B不直接写成B b,或者B *p呢?
举个例子来说明一下,A 代指鸟类,B是A的子类,B用鸡来表示,C也是A的子类,C用鸭来表示,所以A *a=new B是正确的。A *a=new C也是正确的对吧!假设你拿着钱去上街买肉,钱多买鸡,钱少买鸭,反正最后得买东西,买用buy()方法来表示,那么buy()方法要么返回鸡,要么返回鸭,所以A *a=buy()是正确的,但是如果写成B *b=buy()的话就有可能出错,因为还有可能买鸭回来。所原创 2015-06-29 19:27:36 · 1443 阅读 · 0 评论 -
C++中的static关键字
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:[cpp] view转载 2015-06-09 09:35:15 · 313 阅读 · 0 评论 -
C ++ 虚函数 (转)
第一节、一道简单的虚函数的面试题题目要求:写出下面程序的运行结果? 1、当上述程序中的函数p()不是虚函数,那么程序的运行结果是如何?即如下代码所示:class A{public:void p(){ cout }};class B : public A{public:void p(){ cout转载 2015-06-29 12:09:29 · 521 阅读 · 0 评论 -
int main(int argc,char* argv[])详解
argc是命令行总的参数个数 argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数 命令行后面跟的用户输入的参数,比如: int main(int argc, char* argv[]) { int i; for (i = 0; i i++) cout原创 2015-06-08 11:53:24 · 306 阅读 · 0 评论 -
ostringstream 用法
// ostringstream::rdbuf#include // std::string#include // std::cout#include // std::ostringstreamint main () { std::ostringstream oss; oss << "One hundred and one: " << 101;翻译 2015-06-05 11:08:10 · 527 阅读 · 0 评论 -
explicit的作用
explicit作用:在C++中,explicit关键字用来修饰类的构造函数,被修饰的构造函数的类,不能发生相应的隐式类型转换,只能以显示的方式进行类型转换。explicit使用注意事项: * explicit 关键字只能用于类内部的构造函数声明上。 * explicit 关键字作用于单个参数的构造函数。原创 2015-06-05 10:54:05 · 281 阅读 · 0 评论 -
c++ 智能指针用法详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最转载 2015-06-10 09:23:27 · 574 阅读 · 0 评论 -
std::string用法总结
在平常工作中经常用到了string类,本人记忆了不好用到了的时候经常要去查询。在网上摘抄一下总结一下,为以后的查询方便:string类的构造函数:string(const char *s); //用c字符串s初始化string(int n,char c); //用n个字符c初始化string类的字符操作:const char &operator[](int转载 2015-07-08 16:59:46 · 421 阅读 · 0 评论 -
C++命名空间
一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的同名冲突。 在 C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。 1、全局变量的作用域是整个程序,在同一转载 2015-06-10 09:51:32 · 425 阅读 · 0 评论 -
时间复杂度和空间复杂度详解
算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频转载 2015-11-02 14:41:51 · 421 阅读 · 0 评论 -
教你透彻了解红黑树
大牛的blog http://blog.csdn.net/v_JULY_v/article/details/6105630一、红黑树的介绍先来看下算法导论对R-B Tree的介绍:红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出转载 2015-11-08 15:50:25 · 390 阅读 · 0 评论 -
C/C++基本输入输出函数
关于空格的输入老是混淆,总结下来,方便以后查看。字符 char ch; 输入: cin>>ch //只能输入非空格非回车字符 scanf("%c",&ch);//可以输入任意字符 ch = getchar();转载 2015-10-05 17:33:52 · 547 阅读 · 0 评论 -
堆排序原理及算法实现(最大堆)
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>转载 2015-09-30 09:24:34 · 524 阅读 · 0 评论