C++学习
pty_2007
这个作者很懒,什么都没留下…
展开
-
new和delete函数的重载
#include using namespace std;//new和delete的局部重载例子class test{public: test(){ cout << "test constructor." << endl; } //返回的是void类型的指针 void* operator new (size_t size){ cout << "operator new"原创 2013-09-24 19:59:43 · 718 阅读 · 0 评论 -
头文件包含的含义
头文件包含的含义是将头文件的内容插入到cpp文件中,这样一来,如果自己写了多个头文件,并且这些头文件之间存在相互调用的话,那么就可以根据替换结果是否符合C++语法,判断你的头文件包含是否合理。原创 2013-05-28 09:11:52 · 1084 阅读 · 0 评论 -
二叉树宽度
代码如下://node.hstruct node{ int value; node *lchild; node *rchild;};//tree.h#include "node.h"#include class tree{public: tree(); node* pre_build_tree(char *filename); int wight(); p原创 2013-05-11 16:36:19 · 846 阅读 · 0 评论 -
栈和队列的相互实现
两个队列可以实现栈;两个栈可以实现队列;原创 2013-05-10 19:45:53 · 739 阅读 · 0 评论 -
strcmp函数的几点记录
以下是strcmp函数代码:int strcmp(const char *dest, const char *src){ assert(dest != NULL && src != NULL); while(*dest && *src && *dest++ == *src++); return *dest - *src; }有这么几点我忽略的地方,这里做记录:1.'\0原创 2013-05-10 19:38:58 · 795 阅读 · 0 评论 -
void指针
1.void指针可以指向任意数据类型,即任意数据类型的指针都可以赋值给void指针;void要转换为其他类型的指针的话就要进行强制转换,并且这个转换过程是很容易出现问题的,要谨慎使用;2.void指针是不可以间接引用的,下来代码不能通过编译:#include using namespace std;void main(){ int value = 10; void原创 2013-04-11 11:41:44 · 754 阅读 · 0 评论 -
C++程序栈溢出
Windows下C++程序默认的栈空间是2M(VC++2008编译器默认1M,这个值是可以在编译器中设置的。随手写了一段栈溢出的代码: #include using std::cout; using std::endl;int main() { int a[1024][256]={0}; //在栈上分配,大小为1M,运行时栈溢出挂掉! return 0转载 2013-05-10 10:08:58 · 1037 阅读 · 0 评论 -
堆上的溢出
在一次写代码的过程中,突然遇到的一个错误:如果使用new时不对new操作是否成立的话会导致内存操作错误。下列代码所示:#include using namespace std;struct node{ int value; struct node * next;};void main(){ struct node *head = new node; head -> n原创 2013-05-07 16:32:12 · 699 阅读 · 0 评论 -
不能继承内置数据类型
在c++语言中,不能继承int,float此类的内置数据类型。另外, 在java语言中,不能继承Integer之类的数据类型,这些数据类型都被声明为final了。原创 2013-05-20 19:57:57 · 747 阅读 · 0 评论 -
c++ primer 17.22 实验代码
#include using namespace std;namespace primerLib{ void com(){ cout << "com()" << endl; } void com(const void *){ cout << "com(const void *)" << endl; }}void com(int){ cout << "com(int)"原创 2013-04-21 09:51:58 · 862 阅读 · 0 评论 -
基类列表中不能有重复出现的基类
派生类的基类列表中不能有重复出现的基类。下列代码会报错:#include using namespace std;class Base1{};class Base2{};class Drived: public Base1, public Base2, public Base2{};void main(){ Drived drived;}原创 2013-04-21 10:07:02 · 913 阅读 · 0 评论 -
auto_ptr解析
auto_ptr是当前C++标准库中提供的一种智能指针,或许相对于boost库提供的一系列眼花缭乱的智能指针, 或许相对于Loki中那个无所不包的智能指针,这个不怎么智能的智能指针难免会黯然失色。诚然,auto_ptr有这样那样的不如人意,以至于程序员必须像使用”裸“指针那样非常小心的使用它才能保证不出错,以至于它甚至无法适用于同是标准库中的那么多的容器和一些算法,但即使如此,我们仍然不能否认这个转载 2013-04-20 17:26:39 · 566 阅读 · 0 评论 -
异常的抛出基本问题
1.使用throw exception object ;语句进行异常的抛出,异常对象可以是内置数据类型,也可以是自定义数据类型或者标准库中的异常数据类型;2.3.catch匹配次序是一次配中,随后则不再匹配。所以,对于一个派生类对象,catch字句的放置顺序就要留意了,应该将catch派生类异常对象的语句放置在catch基类异常对象语句的前面。4.可以使用throw;语句二次抛出异常。原创 2013-04-20 15:25:28 · 901 阅读 · 0 评论 -
构造函数和析构函数的相互调用
看《代码大全》的时候,看到这么个问题,所以特意写代码进行了下测试。(VC 6.0 WIN XP SP3 32BIT)代码如下:#include using namespace std;class Test{public: Test(){ // ~Test(); cout << "this is constructors." << endl; } ~Test()原创 2013-04-18 09:15:56 · 990 阅读 · 0 评论 -
类的inline函数
inline关键词在类的函数声明或者定义部分出现一次就可以了,当然出现两次岂不是更加完整吗!下列代码严重了这点(VC 6.0 WIN XP 32BIT)#include using namespace std;class Test{public: Test(){} ~Test(){} void show();};inline void Test::show(){原创 2013-04-17 20:21:36 · 764 阅读 · 0 评论 -
const虚函数
在C++中,对于两个函数,一个有const修饰,一个没有const修饰,认为这两个函数是不同的函数。而虚函数的要求是,函数原型相同,函数原型包括:函数返回值、函数名、参数列表、const修饰符。这里const修饰符包括函数返回值的修饰,函数形参的修饰,函数本身的修饰。只要有一处const没有对上 ,那么就不是虚函数的重载,而是发生了同名覆盖现象。这个与编译器的工作原理有关。所以对于基类的c原创 2013-04-17 10:14:41 · 4296 阅读 · 0 评论 -
重载函数的继承问题
如果基类有很多歌重载函数(注意:重载函数应该是属于同一个作用域的),那么子类要想使用基类的这些重载函数的话,要么一个函数都不定义,要么重新定义所有的重载函数。因为如果只定义一个或者几个,都会导致”同名覆盖“,而无法达到目的。原创 2013-04-17 09:43:08 · 836 阅读 · 0 评论 -
类的同名覆盖和函数重载
有下列代码:#include using namespace std;struct Base{ void foo (int){};};struct Derived: public Base{ void foo(string){};};void main(){ Derived d; d.foo(1024);}这是《C++ primer》题15.23的一原创 2013-04-17 09:26:00 · 1077 阅读 · 1 评论 -
数组分页导致的性能损失验证程序
#include #include using namespace std;#define N 4096void main(){ int **a = new int*[N]; for(int i = 0; i < N; i++) a[i] = new int[N]; int **b = new int*[N]; for(i = 0; i < N; ++i) b[i] =原创 2013-05-14 19:45:19 · 747 阅读 · 0 评论 -
VC 6.0 代码执行时间测量 代码
#includeusing namespace std;void main(){ clock_t begin = clock(); //... clock_t end = clock();}原创 2013-05-15 09:28:56 · 759 阅读 · 0 评论 -
自顶向下的考虑问题
其实,说实话学了也说了这么多的面向对象设计方法,可是对这个设计方法实在是不敢说有多么好的理解。今天按照《c++沉思录》上的第八章课堂练习做了下,多使用面向对象设计方法有了更加深刻的理解。我的首要感觉是面向对象就像是自顶向下的设计,顶就是类的设计,下就是函数体的设计。而函数参数的设计也是顶的一部分。所以函数参数的设计也不能忽略。面向对象设计方法需要多多实践和感受。原创 2013-05-29 10:57:24 · 812 阅读 · 0 评论 -
C/C++中static关键字详解
来源:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777441.html 静态变量作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,使用时可以改变其值。 静态变量或静态函数只有本文件内的代码才能访问它,它的名字在其它文件中不可见。用法1:函数内部声明的static变量,可作为对转载 2013-09-24 21:19:13 · 745 阅读 · 0 评论 -
程序编译后运行时的内存分配
原文地址:程序编译后运行时的内存分配-转作者:知足常乐一、编译时与运行时的内存情况1.编译时不分配内存编译时是不分配内存的。此时只是根据声明时的类型进行占位,到以后程序执行时分配内存才会正确。所以声明是给编译器看的,聪明的编译器能根据声明帮你识别错误。2.运行时必分配内存运行时程序是必须调到“内存”的。因为CPU(其中有多个寄存器)只与内存打交道的。程序在进入实际内转载 2013-09-24 21:13:25 · 840 阅读 · 0 评论 -
const变量的实现原理
1 说明今天试验了下const存储的问题,收获很多,所以做个记录。如果有错误请指针。我的试验环境xp + vc6.0(sp6)。虽然不能代表所有的浏览器,但是也有代表性吧。考虑const存储问题,我觉得最重要的一点应该是要区分全局const变量和局部const变量。单纯的说const变量是没有意义的。下面将就1)局部const存储;2)常量替换;3)局部const的修改;原创 2013-09-25 11:39:25 · 2730 阅读 · 0 评论 -
一个进程在内存中的布局
来源:http://patmusing.blog.163.com/blog/static/135834960201001512358686/对于一个完整的程序,在内存中分布情况如下图: 值得一提的是:在C#中struct存放在栈区,class存放在堆区,所以一般struct要比class要快的。 堆和栈的比较表(仅针对C++)转载 2013-09-25 09:48:37 · 724 阅读 · 0 评论 -
哈夫曼树
1. 哈夫曼树的基本概念 哈夫曼树( Huffman )又称最优二叉树,是一类带权路径长度最短的树,有着广泛的应用。 在讨论哈夫曼树之前首先需要弄清楚关于路径和路径长度的概念。树中两个结点之间的路径由一个结点到另一结点的分支构成。两结点之间的路径长度是路径上分支的数目。树的路径长度是从根结点到每一个结点的路径长度之和。 设一棵二叉树有 n 个叶子结点,每个叶子结点拥有一个权值W转载 2013-09-25 15:48:04 · 1882 阅读 · 0 评论 -
char *与char[]的区别
下列代码:char *str1 = "hfut";char *str2 = "hfut";char str3[] = "new";char str4[] = "new";str1和str2实际上指向的是同一个内存区域,因为"hfut"被编译器是视为常量,存放在常量区了。而,str3和str4指向的不是同一个内存去也,它实际上是在栈上开辟一个数组,然后把常量区的"new"复制原创 2013-05-10 21:05:07 · 680 阅读 · 0 评论 -
堆与栈的区别
这个是我目前看到的分析的最全面的了。. 堆与栈的去区别A. 申请方式不同Stack由系统自动分配,而heap需要程序员自己申请,并指明大小。B. 申请后系统的响应不同Stack:只要栈的剩余空间大于申请空间,系统就为程序提供内存,否则将抛出栈溢出异常Heap:当系统收到程序申请时,先遍历操作系统中记录空闲内存地址的链表,寻找第一个大于所申请空间的堆结点,然后将该结点转载 2013-10-06 22:12:55 · 887 阅读 · 0 评论 -
仿函数,即函数对象,的一个简单例子
#include#include#include#includeusing namespace std;class student{public: student(){}//这个构造函数是必需的,因为sort的第三个参数需要一个默认的student对象即可 student(int x, string str){ age=x; name=str; } int age;原创 2013-10-06 17:15:30 · 984 阅读 · 0 评论 -
从stl的max函数写法学到的
下面是stl库中的max函数的源码:templateinline const T max(const T &a, const T &b){ return a > b?a:b;}有如下特点:简单的函数可以避免代码膨胀,所以使用内联的形式实现;参数和返回值均是const型的,做到十分的安全;参数是以传引用的方式传递的,这是因为已经被限定为const,那么即使是使用原创 2013-10-06 10:52:44 · 1510 阅读 · 0 评论 -
对集合{1, 2, 3, …, n}中的数进行全排列,可以得到 n!个不同的排列方式
题目如下:. 对集合{1, 2, 3, …, n}中的数进行全排列,可以得到 n!个不同的排列方式。现在我们用字母序把它们列出来,并一一标上序号,如当 n=3 时:0.1231.1322.2133.2314.3125.321现在,请书写一个函数 void print (int n, int k), (函数原型是用 C语言写的,你可以用你熟悉的语言)在已知 n和序号原创 2013-10-07 10:42:49 · 1854 阅读 · 0 评论 -
异常的匹配规则
c++中,异常的匹配按照一旦选中则不再继续的规则进行,所以在放置catch语句时候要考虑清楚后面的catch是不是有机会工作。原创 2013-10-05 20:07:31 · 1028 阅读 · 0 评论 -
条件运算符
关于条件运算符,c++要求第一个表达式是逻辑表达式,第二个和第三个表达式的类型应该是相同的。如下代码:#includeusing namespace std;void main(){ cout << 1?1:"hu";}//条件运算符要求两个参数的类型都是一样的则是错误的。原创 2013-10-07 13:47:36 · 687 阅读 · 0 评论 -
将整型变量 x 中数字左右翻转后存到另外一个整型变量 y中
一道面试题。很常见却也有点新意,特记录如下:题目:将整型变量 x 中数字左右翻转后存到另外一个整型变量 y中,例如 x = 12345 时,y为 54321,x = ‐123 时,y为‐321。其中 x 的个位不为 0。分析:常见的翻转是对字符串进行,此处是对int数进行。将x的每位拆出来,放入队列中。经过这个过程就能知道x有多少位,再从队列中取出数据并乘以pow(10,位原创 2013-10-07 10:28:50 · 1220 阅读 · 0 评论 -
vector的自增长问题
有如下代码:#include #include#includeusing namespace std;int fun (vector&val){ copy(val.begin(),val.end(),ostream_iterator(cout,"\n")); return 1;}void main(){ int a[5]={1,2,3,4,5}; vector v;原创 2013-10-05 10:43:12 · 798 阅读 · 0 评论 -
为类设计init函数的好处
可以将对象的构造从构造函数中分离出来,如果不适用init,每次执行init中的初始化代码的机会只有调用该构造函数一次,而如果将这个初始化的代码分离到init函数中,则会有无数次的调用这些初始化代码的机会。这样一来我们甚至可以仅仅先使用默认构造函数创建一个对象,然后再为这个对象进行初始化操作。原创 2013-05-29 10:24:40 · 892 阅读 · 0 评论 -
函数返回一个对象时要调用复制构造函数的原因
因为如果函数返回的是一个局部对象,这个局部对象在函数运行结束时就会被释放掉,这是不合法的,所以调用构造函数先构造一个非局部对象,这样避免 了返回局部对象的错误。原创 2013-05-29 10:19:46 · 1567 阅读 · 0 评论 -
应该提供默认构造函数的原因
暂时想到的,以此做记录:1.要构造对象数组;2.要使用暂存对象作为运算结果为对象类型数据的中转,类似交换两个数据值的函数中使用的temp;原创 2013-05-29 10:15:31 · 734 阅读 · 0 评论 -
用测试程序分析类的内存布局1
下面用程序测试与类的内存布局相关的东西。看仔细看下面程序,建议自己动手运行:#includeusing namespacestd; class A{ }; class B{public: void shw(){}}; class C{public: virtual void show(){}};原创 2011-10-17 22:22:41 · 479 阅读 · 0 评论 -
C++类继承中的访问控制符可以省去
C++类继承中的访问控制符可以省去:1.采用class关键字进行的类继承默认采用继承方式是private,如下例:#include using namespace std;class TestA{};class TestB: TestA{};void main(){ TestA a; TestB b;} 2.采用sruct关键字进行的类继承默认采用继承方式原创 2013-04-15 16:15:53 · 889 阅读 · 0 评论