- 博客(29)
- 资源 (3)
- 收藏
- 关注
转载 为什么构造函数不能为虚函数
1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。2,从使用角度 虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数
2014-10-05 17:07:57
318
转载 C++中使用copy和ostream_iterator来输出map的内容
对于copy配合iterator来输出一些容器的便利性是非常喜欢的,但是copy在处理map容器的时候,很容易导致编译出错,问题代码如下: 1 ostream& operator out, const pairconst int,int>& value) 2 { 3 out 4 return out; 5 } 6 int main() 7 { 8
2014-09-29 22:17:36
837
原创 c++ primer (第10章 泛型算法) 算法
#include#include#include#include#include#include#includeusing namespace std;int main(){ vector v1 = { 1, 3, 5, 7, 9, }; vector vs = { "aaa", "bbb", "ccc", "ddd", "eee" };//只读算法,只读取而不改变元
2014-09-26 21:54:41
315
转载 char* 和char[]的区别
以下内容均来自互联网,系笔者汇总并总结。1. 问题介绍问题引入:在实习过程中发现了一个以前一直默认的错误,同样char *c = "abc"和char c[]="abc",前者改变其内容程序是会崩溃的,而后者完全正确。程序演示:测试环境Devc++代码#include using namespace std;main(){
2014-09-22 14:07:38
301
转载 (总结)C++中实现代码重用的手段----继承和聚合
C++中实现代码重用的手段: 1.继承: B继承A的条件: 逻辑上B是A的"一种(a kind of)",且A的所有属性和功能对B都有意义,则容许继承. 比如CSaleman(销售人员)类继承CCompanyStaff(员工)类, 轿车可以继承交通工具的所有特征.因为轿车是一种交通工具. 2.
2014-09-20 00:25:17
813
转载 实现一个无法被继承的C++类
一个类不能被继承,也就是说它的子类不能构造父类,这样子类就没有办法实例化整个子类从而实现子类无法继承父类。我们可以将一个类的构造函数声明为私有,使得这个类的构造函数对子类不可见,那么这个类也就不能继承了。但是,这引出一个问题,客户程序岂不是也无法实例化这个类了?OK,让我们参考一下Singleton模式,用一个static函数来帮助创建这个类的实例,问题就解决了!class CPa
2014-09-20 00:21:41
320
转载 C++模板学习
一、什么是模板 在C++编程中,当我们需要获取两个变量之间的较大值时,考虑到变量的类型可能会是int、double等,最常用的方法往往是通过重载函数,实现不同类型的函数版本:[cpp] view plaincopyint Max(int lhs, int rhs) { return (lhs > rh
2014-09-20 00:20:10
290
转载 直接初始化与复制初始化
这是C++中所支持的两种初始化方式。 复制初始化使用=符号,而直接初始化将初始化式放在圆括号中。 (1)对于一般的内建类型,这两种初始化基本上没有区别。 int a(5);//直接初始化 int a=5;//复制初始化 int a=int (5);//直接初始化 (2)当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初
2014-09-20 00:18:31
362
转载 模板显式、隐式实例化和(偏)特化、具体化的详细分析
最近看了看到了模板的特化,突然想起来上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。 一下是我把再网上找的资料整理一下。 看着这么多叫法,其实就是三种。 1. 显示实例化 2. 隐式实例化 3. 特化(=具体化)、偏特化一、实例化
2014-09-20 00:17:46
325
转载 C++ 虚函数表解析
C++ 虚函数表解析 陈皓http://blog.csdn.net/haoel 前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,R
2014-09-20 00:17:35
227
转载 虚继承与虚基类的本质(介绍的非常详细)
虚继承与虚基类的本质 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然这两个概念的定义是非常的简单明确的,但是在C++语言中虚继承作为一个比较生僻的但是又是绝对必要的组成部份而存在着,并且其行为和模型均表现出和一般的继承体系之间的巨大的差异(包括访问性能上的差异),现在我们就来彻底的从语言、模型、性能和应用等多个方面对虚继承和虚基类进行
2014-09-20 00:17:09
2066
转载 C/C++返回内部静态成员的陷阱
C/C++返回内部静态成员的陷阱陈皓背景在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼。这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员。如果你的内存是在函数内栈上分配的,那么这个内存会随着函数的返回而被弹栈释放,所以,你一定要返回一块函数外部还有效的内存。这是一个让无数人困扰的问题。如果你
2014-09-20 00:13:36
379
转载 C语言的那些秘密之---函数返回局部变量
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意
2014-09-20 00:12:29
293
转载 C++的一大误区——深入解释直接初始化与复制初始化的区别
不久前,在博客上发表了一篇文章——提高程序运行效率的10个简单方法,对于其中最后一点,多使用直接初始化,有很多读者向我提出了疑问,并写了一些测试程序,来说明直接初始化与复制初始化是同一件事。让我了解到大家对于直接初始化与复制初始化的区别的确是不太清楚,无可否认,那篇文章的例子用得的确不太好,在这里表示歉意!所以我觉得还是有必要跟大家详细分享一下我对直接初始化和复制初始化的理解。
2014-09-20 00:11:39
274
转载 纯虚析构函数的作用
在某些类里声明纯虚析构函数很方便。纯虚函数将产生抽象类——不能实例化的类(即不能创建此类型的对象)。有些时候,你想使一个类成为抽象类,但刚好又没有任何纯虚函数。怎么办?因为抽象类是准备被用做基类的,基类必须要有一个虚析构函数,纯虚函数会产生抽象类,所以方法很简单:在想要成为抽象类的类里声明一个纯虚析构函数。 这里是一个例子: class awov { public: vir
2014-09-20 00:11:37
433
转载 C++ virtual 析构函数
C++中虚析构函数的作用我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明: 有下面的两个类:[cpp] view plaincopy#include using namespace std; class ClxBase { publi
2014-09-19 19:51:50
369
转载 教你透彻了解红黑树
教你透彻了解红黑树 作者:July、saturnman 2010年12月29日本文参考:Google、算法导论、STL源码剖析、计算机程序设计艺术。推荐阅读:Left-Leaning Red-Black Trees, Dagstuhl Workshop on Data Structures, Wadern, Germany, Fe
2014-09-19 15:06:33
287
原创 循环队列
#includeusing namespace std;const int Max=10;struct queue{ int data[Max]; int front; int rear;};void initqueue(queue &s){ s.front=0; s.rear=0;}bool isempty(queue &s){ return(s.fr
2014-09-19 15:02:12
279
原创 自定义String类
#includeusing namespace std;class String{private: char *s; int len; static int count; //静态类成员,类内声明,类外定义public: String(); String(const
2014-09-18 17:01:33
321
原创 堆排序
#includeusing namespace std;void adjustdown(int a[],int i,int len){ a[0]=a[i]; //此时a[0]存储的是要调整的非叶节点的值 for(int j=2*i;j<=len;j*=2) { if(ja[j+1]) j++; if(a[0]
2014-09-14 18:14:29
269
原创 归并排序
#include"aa.h"#include#include#includeusing namespace std;void merge(int a[],int left,int mid,int right){ //const int len=sizeof(a); int b[10]; int k; for(k=left;k<=right;k++) //申请新
2014-09-13 17:31:32
263
原创 将字符串按单词逆序
#include"aa.h"#includeusing namespace std;void wordreverse(char *s){ int len=strlen(s); int i=0; while(s[i]!='\0') { if(s[i]!=' ') { int j=i; //j为要逆序的单词第一个字母位置
2014-09-10 19:39:36
457
原创 快速排序
#includeusing namespace std;void quicksort(int s[],int left,int right){ if(left<right) { int i=left,j=right; int index=s[left]; while(i<j) { while(iindex) j--; s[
2014-09-10 00:56:12
304
原创 希尔排序
#include#include"time.h"using namespace std;void ShellSort(int s[],int len){ int i,j,step,temp,n=1; for(step=len/2;step>=1;step=step/2) //关键:step为
2014-09-04 17:52:14
314
原创 折半插入排序
#include#include"time.h"using namespace std;void Half_InsertSort(int s[],int len){ int temp,i,j,mid,high,low; for(i=1;i<len;i++) { temp=s[i]; low=0; high=i-1; while(low<=high)
2014-09-04 17:27:13
286
原创 直接插入排序
//#include"aa.h"#include"time.h"#include using namespace std; void InsertSort(int s[], int len){ int j; for(int i=1;i<len-1;i++) //s[0]已在正确位置,从s[1]开始扫描 { int temp=s[
2014-09-03 18:56:19
289
原创 简单选择排序
#include using namespace std; void SelectSort(int s[], int);int main(){ int a[10]={6,3,14,12,4,5,1,31,53,62,}; SelectSort(a,10); cout<<endl; cout system("pause"); return 0;}void Sel
2014-09-03 17:19:48
183
原创 冒泡排
啊啊啊#include using namespace std; void BubbleSort(int s[], int);int main(){ int a[10]={6,3,14,12,4,5,1,31,53,62,}; BubbleSort(a,10); cout<<endl; cout<<"程序耗时: "<<clock()<<" ms"<<endl;
2014-09-03 17:16:51
365
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人