![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
chjjunking
这个作者很懒,什么都没留下…
展开
-
C++中继承时的重载和重新定义
C++编程思想 P372对于虚函数,在派生类中:不允许改变返回值(非虚函数派生类可以。),特殊情况:但是当返回值的类型是基类返回值类型的派生类时,可以改变。如果重新定义了基类的重载成员函数,也就是定义了一个同名的函数,但参数不同,则基类的其它函数将被隐藏。原创 2014-03-28 11:02:50 · 1886 阅读 · 0 评论 -
C++异常处理的用处
异常处理一个用处在于将正常的处理流程中跳到恰当的异常处理器中,使得异常处理与正常的处理流程隔离。使得程序设计过程更加流畅。 异常处理保证当程序执行流程离开一个作用域的时候,对于属于该作用域的所有由 “构造函数建立起来的” 对象,它们的析构函数一定会被调用。 然而,如果一个对象的构造函数在执行过程中抛出异常的话,则它的析构函数将不会被调用。因此,编写构造函数的时候,程序员必须特别的仔细原创 2014-03-04 12:14:50 · 2121 阅读 · 0 评论 -
C++中的cast
dynamic_cast:用于向下类型转换。该函数仅当向下类型转换是正确的时候返回有效的指针,否则返回0;所以说他是安全的。注意:通常在向下类型转换和向上类型转换时,指针的值会有所调整,特别是在多重继承的时候。当知道确实是该类型时,可以用static_cast代替dynamic_cast。原创 2014-03-04 12:14:27 · 1536 阅读 · 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 · 1167 阅读 · 1 评论 -
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 · 4351 阅读 · 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 · 2183 阅读 · 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 · 1923 阅读 · 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 · 2011 阅读 · 0 评论 -
C++析构函数和虚析构函数。
析构函数如果不是虚的话,基类的析构函数将不会被调用。多态时,也就是派生类被基类指针所指,或者被基类别名:虚析构函数,被调用时,其自身的析构函数和基类的析构函数都将会被调用。非虚的时候,不进行多态,只有基类的会被调用。纯虚析构函数:定义的时候除了加“=0”。还需要给出函数的实现。因为当递归的调用析构函数时需要自动执行。作为一个准则,任何时候我们的类中都要有一个虚函数,我们原创 2014-03-04 12:14:21 · 1677 阅读 · 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 · 556 阅读 · 0 评论 -
C++中operator =
默认的operator= 和默认的拷贝构造函数做了同样的事情,递归的对基类和类中的对象进行拷贝构造。原创 2014-03-04 12:16:01 · 1787 阅读 · 0 评论 -
模板中的嵌套类
#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 · 5516 阅读 · 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 · 2179 阅读 · 0 评论 -
C++中的继承 public protected private
public protected private共有继承 public protected 不可见私有继承 private private 不可见保护继承 protected protected 不可见#includeusing namespace std;////////转载 2014-03-28 11:03:50 · 1863 阅读 · 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 · 3661 阅读 · 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 · 1862 阅读 · 0 评论 -
C++对象切片
// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include #include #include using namespace std; class Pet { string pname; public: Pet(Pet& p) { pname=p.pname; }原创 2014-03-28 11:03:06 · 4277 阅读 · 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 · 1894 阅读 · 0 评论 -
C++异常处理catch向上类型转换。
匹配的异常并不要求与其捕获的对象类型一致。一个对象或者是指向派生类对象的引用都会与其积累处理器匹配。如果是对象本身而不是引用或指针的话,这个异常对象将会被“切割”,丢失派生类包含的所有信息。因此最好是抛出引用,或者是指针。但是不会进行自动类型转换。比如如下情况:class Except1{};class Except2{public: Except2(co原创 2014-03-04 12:14:45 · 2032 阅读 · 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 · 815 阅读 · 0 评论 -
C++函数的继承,所有函数都能自动继承吗?
构造函数和析构函数不能够自动继承到派生类。operator=也不能被继承。因为他完全类似于构造函数的活动。如果基类没有定义operator=,则系统将自动生成成员方式的赋值。原创 2011-12-08 19:57:52 · 839 阅读 · 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 · 756 阅读 · 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 · 589 阅读 · 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 · 781 阅读 · 0 评论 -
int的取值范围
0x80000000~0x7FFFFFFF原创 2012-08-20 11:14:16 · 787 阅读 · 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 · 808 阅读 · 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 · 1015 阅读 · 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 · 2010 阅读 · 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 · 1359 阅读 · 0 评论 -
链表问题:如何判断一个链表有环,以及环的长度,起始位置。
1. 判断链表是否有环:采用两个指针,一个每次循环前进一步,一个每次循环前进两步。如果存在环,则一定会相交。否则速度快的指针首先为NULL,或其next为NULL。2. 环的长度:从相交点开始,循环一次,直到再次到该相交点。循环次数即为环的长度。3. 环的起始位置:若相交点为P,环长度为M。计算head节点到交点的距离,为N。则有,P点走M距离回到P点。head走N原创 2012-08-13 15:33:58 · 1103 阅读 · 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 · 745 阅读 · 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 · 959 阅读 · 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 · 738 阅读 · 1 评论 -
写正确函数需要注意的地方:链表的逆转,递归与非递归
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 · 1102 阅读 · 1 评论 -
写正确函数需要注意的地方:快速返回斐波那契数的第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 · 1817 阅读 · 0 评论 -
写正确函数需要注意的地方:输入两个整数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 · 1964 阅读 · 0 评论 -
继承与静态成员函数
1.静态成员函数与非静态成员函数都可被继承到派生类中。2.如果重新定义了一个静态成员,所有在基类中的其他重载函数都会被隐藏。(和非静态相同)3.如果改变了一个基类函数的实现,则所有使用该函数名字的基类版本都将被隐藏。(和非静态相同)4.静态static成员函数不可以是虚函数virtual。原创 2011-12-08 20:04:03 · 1963 阅读 · 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 · 909 阅读 · 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 · 916 阅读 · 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 · 802 阅读 · 0 评论