C语言复习要点
chjjunking
这个作者很懒,什么都没留下…
展开
-
C++中的继承 public protected private
public protected private共有继承 public protected 不可见私有继承 private private 不可见保护继承 protected protected 不可见#includeusing namespace std;////////转载 2014-03-28 11:03:50 · 1868 阅读 · 0 评论 -
C++异常处理catch向上类型转换。
匹配的异常并不要求与其捕获的对象类型一致。一个对象或者是指向派生类对象的引用都会与其积累处理器匹配。如果是对象本身而不是引用或指针的话,这个异常对象将会被“切割”,丢失派生类包含的所有信息。因此最好是抛出引用,或者是指针。但是不会进行自动类型转换。比如如下情况:class Except1{};class Except2{public: Except2(co原创 2014-03-04 12:14:45 · 2034 阅读 · 0 评论 -
throw后局部变量的析构。
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #include using namespace std; class object{public: ~object() { cout<<"~object()"<<en原创 2014-03-04 12:14:37 · 2020 阅读 · 0 评论 -
写正确程序需要注意的地方:输入一个正数n,输出所有和为n连续正数序列。
int sequenceFactor(int n){ if(n<=0) return -1; for(int i=2;i<=n/2;++i) { if(i%2==1)//需要分成奇数个 { int div=n/i;//则商为中间值。 if(n%i==0 && div-(i-1)/2>0)//必能整除,并且最小数应该大于0。 { printf("%d..原创 2014-03-04 12:13:37 · 757 阅读 · 0 评论 -
C++普通成员函数的重定义
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;class Base{public: int f(){ cout<<"int f() Base"<<endl; return 0; } void f(int){ cout原创 2011-12-08 19:46:07 · 1169 阅读 · 1 评论 -
模板中的嵌套类
#include "stdafx.h"#include #include using namespace std; template class X{ //without typename , you should get an error: typename T::id i; //T::id i;public: void f(){i.g();}};cl原创 2014-03-04 12:15:03 · 5523 阅读 · 0 评论 -
C++析构函数和虚析构函数。
析构函数如果不是虚的话,基类的析构函数将不会被调用。多态时,也就是派生类被基类指针所指,或者被基类别名:虚析构函数,被调用时,其自身的析构函数和基类的析构函数都将会被调用。非虚的时候,不进行多态,只有基类的会被调用。纯虚析构函数:定义的时候除了加“=0”。还需要给出函数的实现。因为当递归的调用析构函数时需要自动执行。作为一个准则,任何时候我们的类中都要有一个虚函数,我们原创 2014-03-04 12:14:21 · 1679 阅读 · 0 评论 -
写正确程序需要注意的地方:一个数组是有一个递减数列座椅若干位形成的,在这种数组中查找某一个数。
//4,3,2,1,10,9,8,7,6,5int searchInRotateSortedArray(int* arr, int count, int value){ if (count<=0 || arr==NULL) return -1; int mid; int left=0; int right=count-1; while (left<=right) { //原创 2014-03-04 12:13:48 · 784 阅读 · 0 评论 -
C++ 指向成员的指针(数据成员指针,函数成员指针)
数据成员指针:class Data{public : int a, b,c;}定义数据成员指针:int (Data::*pmInt)=&Data::a;这样子的话pmInt就可以指向某个Data对象中的所有int数据成员。如:pmInt=&Data::a;定义一个DataData d;d.*pmInt=48;//d.a=48;函数成员指针:原创 2014-03-04 12:15:55 · 2186 阅读 · 0 评论 -
template函数
#include "stdafx.h"#include #include using namespace std; template T sum(T b,T e, T init=T()){ char chars[N]; cout<<"N: "<<N<<endl; init=b+e; return init;}template T sum(T b,T e,原创 2014-03-04 12:14:57 · 1928 阅读 · 0 评论 -
继承与静态成员函数
1.静态成员函数与非静态成员函数都可被继承到派生类中。2.如果重新定义了一个静态成员,所有在基类中的其他重载函数都会被隐藏。(和非静态相同)3.如果改变了一个基类函数的实现,则所有使用该函数名字的基类版本都将被隐藏。(和非静态相同)4.静态static成员函数不可以是虚函数virtual。原创 2011-12-08 20:04:03 · 1966 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的合并排序
Node* mergeSort(Node* head, int length){ if(length==0) return NULL; if(length==1) { head->pNext=NULL;//一定要赋值为NULL,否则可能出现死循环。 return head; } int halflength=length/2; Node* halfp=head; fo原创 2014-03-04 12:12:54 · 560 阅读 · 0 评论 -
C++ 中的vptr与vtable
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;class no_virtual { int a;public: void x() const{} int i() const {return 1;}};class on原创 2014-03-28 11:03:38 · 3668 阅读 · 0 评论 -
C++纯虚函数
抽象基类:函数调用时,形参不能够是抽象基类,而应该是“指针”或者是"引用"。// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;class Base { int a;public: virtual void x()原创 2014-03-28 11:03:23 · 1867 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的及时终止冒泡排序
Node* sort(Node* phead){ if (NULL==phead || NULL==phead->pNext) { return phead; } Node* ptemp=phead; Node* plastchangepoint=NULL;//标记上一次 while (plastchangepoint!=phead->pNext) { bool chan原创 2014-03-28 11:02:31 · 1898 阅读 · 0 评论 -
C++函数的继承,所有函数都能自动继承吗?
构造函数和析构函数不能够自动继承到派生类。operator=也不能被继承。因为他完全类似于构造函数的活动。如果基类没有定义operator=,则系统将自动生成成员方式的赋值。原创 2011-12-08 19:57:52 · 846 阅读 · 0 评论 -
C++继承时,构造函数与析构函数的顺序
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;class element1{public: element1(int) { cout<<"element1(int)"<<endl; } ~element1() {原创 2011-12-08 19:32:39 · 592 阅读 · 0 评论 -
C++的new 和 delete 操作符重载。
测试代码:// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include using namespace std;class test{public: int a; double x; test(int i,double m):a(i),x(m) { printf("cr原创 2014-03-04 12:16:20 · 4362 阅读 · 0 评论 -
写正确函数需要注意的地方:输入一个字符串,打印出该字符串中字符的所有排列
void allPermutations(char* arr, char* desarr, bool* assis, int count, int curindx){ if(curindx==count) { desarr[curindx]=0; printf("%s\n",desarr); return; } for(int i=0;i<count;++i) { i原创 2014-03-04 12:13:27 · 912 阅读 · 0 评论 -
只能用于构造函数的explicit
这个关键字只能用于构造函数,意思是该构造函数不能隐式的被调用。当有隐式的类型转换的时候,该explicit可以阻止这一过程。如:class One{public:One(){}};class Two{public:Two(const One&){}};void f(Two){}int main(){One one;f(one);}该程序原创 2014-03-04 12:16:07 · 2186 阅读 · 0 评论 -
C++中的cast
dynamic_cast:用于向下类型转换。该函数仅当向下类型转换是正确的时候返回有效的指针,否则返回0;所以说他是安全的。注意:通常在向下类型转换和向上类型转换时,指针的值会有所调整,特别是在多重继承的时候。当知道确实是该类型时,可以用static_cast代替dynamic_cast。原创 2014-03-04 12:14:27 · 1539 阅读 · 0 评论 -
C++中operator =
默认的operator= 和默认的拷贝构造函数做了同样的事情,递归的对基类和类中的对象进行拷贝构造。原创 2014-03-04 12:16:01 · 1795 阅读 · 0 评论 -
写正确函数需要注意的地方:最大堆的创建与堆排序
void push_down(int* a, int indx,int count){ do { int leftindx=indx*2+1; int rightindx=leftindx+1; //在将indx所指的元素向下压的时候,将左右两个子节点中最大的,并且大于indx本身的向上提。 //如果没有可以上提的左右子节点,则结束。 if (leftindx=coun原创 2012-08-19 17:49:01 · 1017 阅读 · 0 评论 -
写正确函数需要注意的地方:两个有序链表的合并
Node* merge(Node* p1, Node* p2){ //检验输入参数。 if(p1==NULL) return p2; else if(p2==NULL) return p1; Node* head; Node* p; if (p1->value>p2->value) {//使得p1的第一个元素大于p2的。 p=p1; p1=p2; p2=p;原创 2012-08-19 16:45:04 · 809 阅读 · 0 评论 -
写正确函数需要注意的地方:int转char*, char* 转int。
void invert(char* a, int start, int end){ for(;start<end;++start,--end) { char temp=a[start]; a[start]=a[end]; a[end]=temp; }}int toint(char *str){ int result=0; for(int i=0;str[i]!=0;原创 2012-08-13 17:50:11 · 2014 阅读 · 0 评论 -
写正确函数需要注意的地方:翻转句子中单词的顺序。
void invert(char* a, int start, int end){ for(;start<end;++start,--end) { char temp=a[start]; a[start]=a[end]; a[end]=temp; }}void invertwords(char* a, int start, int end){ invert(a,st原创 2012-08-13 16:58:31 · 1361 阅读 · 0 评论 -
链表问题:如何判断一个链表有环,以及环的长度,起始位置。
1. 判断链表是否有环:采用两个指针,一个每次循环前进一步,一个每次循环前进两步。如果存在环,则一定会相交。否则速度快的指针首先为NULL,或其next为NULL。2. 环的长度:从相交点开始,循环一次,直到再次到该相交点。循环次数即为环的长度。3. 环的起始位置:若相交点为P,环长度为M。计算head节点到交点的距离,为N。则有,P点走M距离回到P点。head走N原创 2012-08-13 15:33:58 · 1111 阅读 · 0 评论 -
写正确函数需要注意的地方:快速排序
//寡人修改两次之后的正确代码。#include#include#include#includeusing namespace std;int genInt(){ return rand()%100;}templateint partition(vector& array, int startindx, int endindx){ int partvalue=arra原创 2012-08-12 15:09:00 · 747 阅读 · 0 评论 -
写正确函数需要注意的地方:strstr
//个人认为比较好的代码char * strstr (register char *buf, register char *sub){ if (buf==NULL || sub==NULL) { return 0; } char *bp; char *sp; if (!*sub) return buf; while (*buf)原创 2012-08-11 20:54:33 · 962 阅读 · 0 评论 -
写正确函数需要注意的地方:二分查找
//正确的算法templateint my_binary_search(vector array, V v){ int left=0; int right=array.size()-1; int middle; while (left<=right)//为了使得最后的right能够被判断到。 { middle=(left+right)/2; if (array[middle原创 2012-08-11 22:07:40 · 741 阅读 · 1 评论 -
写正确函数需要注意的地方:子数组的最大和
int maxSum(int* a, int count){ if(a==NULL) { cerr<<"array==NULL"<<endl; throw ("array == NULL"); } if(count<0) { cerr<<"count<0"<<endl; throw ("count<0"); } int max=0x80000000; int f原创 2012-08-20 11:27:38 · 788 阅读 · 0 评论 -
写正确函数需要注意的地方:链表的逆转,递归与非递归
Node* invert_list(Node* phead){ if(phead==NULL || phead->pNext==NULL)//参数验证 return phead; Node* p1=phead; Node* p2=phead->pNext; Node* p3=phead->pNext->pNext; while(p2!=NULL) { p2->pNext=p原创 2012-08-20 13:28:11 · 1107 阅读 · 1 评论 -
写正确函数需要注意的地方:输入两个整数n和m,从数列1,2,3,...n中随意取几个数,使其和为m,列出所有可能组合
void getCombine(int* aux, int num, int indx, int val){ if(num<indx)//输入参数检测。 return; if(indx==val) { aux[indx]=1;//将最后一个数添加进去 for(int i=1;i<=indx;i++)//遍历所有之前的数,输出 { if(aux[i]==1)原创 2012-08-21 13:22:33 · 1969 阅读 · 0 评论 -
写正确函数需要注意的地方:奇偶数分开,左边偶数,右边奇数。
void oddEvenSort(int* arr,int count){ int left=0; int right=count-1; int midval=arr[left]; while(left<=right) { while(left<=right && arr[right]%2==1) --right; if(left<=right) { arr[l原创 2014-03-04 12:11:28 · 919 阅读 · 0 评论 -
写正确函数需要注意的地方:给定一个十进制整数N,计算从1开始到N的所有整数出现的“1”的个数
int numOf1(int n){ int factor=1; int count=0; while(n/factor!=0) { int higher=n/(factor*10);//当前位置的高位组成的数字。 int cur=n/factor%10;//当前位置数字 int lower=n%factor;//当前位置的低位组成的数字。 if(cur==0) c原创 2014-03-04 12:10:58 · 822 阅读 · 0 评论 -
写正确函数需要注意的地方:最长递减子序列
int longest=0;void LongestSubSeq(int* arr, int count, bool* assis, int curindx, int lastnum, int length){ if(curindx==count) { if(longest<length) { longest=length; for(int i=0;i<count;++原创 2012-09-10 16:12:05 · 807 阅读 · 0 评论 -
写正确函数需要注意的地方:两个非降序链表的并集,1>2>3和2>3>5合并为1>2>3>5。
int OutCombine(Node* p1, Node* p2){ while(p1!=NULL && p2!=NULL) { if(p1->value>p2->value) { coutvalue<<" "; p2=p2->pNext; } else if(p1->valuevalue) { coutvalue<<" "; p1=p1->pN原创 2012-09-10 13:59:52 · 4519 阅读 · 0 评论 -
写正确函数需要注意的地方:二叉树非递归中序遍历
void Inorder_NoRecu(Node* root){//省去了参数正确性检测和返回值。 stack lefts; Node* cur=root; while(cur!=NULL || !lefts.empty()) { if(cur!=NULL) { lefts.push(cur); cur=cur->left; } else { cu原创 2012-09-10 14:43:14 · 989 阅读 · 0 评论 -
写正确函数需要注意的地方:两个序列a,b,大小都为n,序列元素的值为任意整数,无序;要求通过交换a,b中的元素,使序列a元素的和与序列b元素的和之间的差最小
int sum(int* arr, int count){ int sum=0; for(int i=0;i<count;++i) sum+=arr[i]; return sum;}int MinArrayDis(int* a, int* b, int count){ if(a==NULL || b==NULL || count<=0) return -1; bool原创 2012-09-03 13:39:59 · 3328 阅读 · 0 评论 -
写正确函数需要注意的地方:快速返回斐波那契数的第n项
void f(int n, int* a){ static int A[4]={1,1,1,0}; if(n==1) return; f(n/2,a);//计算一半矩阵乘法的结果 int temp[4]; for(int i=0;i<4;i++) temp[i]=a[i]; for(int i=0;i<2;++i)//获得n/2*2的结果 { for(int j原创 2012-08-20 17:12:59 · 1818 阅读 · 0 评论