文章分类 -  C/C++

摘要:一、基本概述虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如上图所示类D继承自类B1、B2,而类B1、B2都继承自类A,因此出现如右图所示的局面(非虚基类)。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。最后形成如左图所示的情况。实现的代码如下:class A;//忽略C1和C2class B1:public virtual A;class B2:public virtual A;class D:public B1,public B2;二、为什么要引入虚拟继承虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继 阅读全文
posted @ 2013-08-06 21:17 z折腾 阅读(225) 评论(0) 推荐(0)
摘要:A:操作符重载实现为类成员函数 重载的操作符在类体中被声明,声明方式如同普通成员函数一样,只不过他的名字包含关键字operator,以及紧跟其后的一个c++预定义的操作符。可以用如下的方式来声明一个预定义的==操作符:class person{private: int age; public: person(int a){ this->age=a; } inline bool operator == (const person &ps) const;};//实现方式如下:inline bool person::operator==(const pers... 阅读全文
posted @ 2013-07-31 22:12 z折腾 阅读(273) 评论(0) 推荐(0)
摘要:一、前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。 关于虚函数的使用方法,我在这里不做过多的阐述。大家可以看看相关的C++的书籍。在这篇文章中,我只想从虚函数的实现机制上面为大家一个清晰的剖析。 二、虚函数表 对C++了解的人都应该知道虚函数(Virtual Function... 阅读全文
posted @ 2013-07-27 05:38 z折腾 阅读(274) 评论(0) 推荐(0)
摘要:先上代码,改错#includeint main(){ char *str = "Hello"; str[0] = 'P'; printf("%s\n",str); return 0;}这里把char *str ="Hello";改为char str[]="Hello"即可;这是由于str指向的是一个常量字符串,常量是不准被修改的,所以程序运行到str[0]='P';这一句应该会出错; 阅读全文
posted @ 2013-07-07 14:01 z折腾 阅读(205) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2013-07-06 00:02 z折腾 阅读(733) 评论(0) 推荐(0)
摘要:一般的来说,函数是可以返回局部变量的。局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。 下面以函数返回局部变量的指针举几个典型的例子来说明:1:[cpp]view plaincopy#includechar*returnStr(){char* 阅读全文
posted @ 2013-07-05 23:46 z折腾 阅读(252) 评论(0) 推荐(0)
摘要:上例子常见的三种数组作为传入参数#includefloat average1(float a[5]){ int i; float sum=0; for(i=0;i<5;i++) { sum+=a[i]; } printf("1:%d %f\n",sizeof(a),sum);}float average2(float a[]){ int i; float sum=0; for(i=0;i<5;i++) { sum+=a[i]; } printf("2:%d %f\n",sizeof(a),sum... 阅读全文
posted @ 2013-07-05 23:32 z折腾 阅读(1430) 评论(0) 推荐(0)
摘要:#include#include typedef struct node { int data; struct node *next; }Node; //创建链表 Node *CreateList(void) { int val,i,n; Node *head,*p,*q; head=NULL; printf("请输入您要建立的链表长度:\n"); scanf("%d",&n); printf("请输入您要输入的数据:\n"); for(i=0;idata=val; if(head==NULL... 阅读全文
posted @ 2013-07-05 12:01 z折腾 阅读(212) 评论(0) 推荐(0)
摘要:1 int main(int argc, char** argv)2 {3 int a[5] = {1,2,3,4,5};4 int* ptr = (int*)(&a + 1);5 printf("%d,%d\n", *(a+1), *(ptr-1));6 return 0;7 }这道题在很多所谓经典C语言面试题里是常见的不能再常见,你知道输出结果吗?答案是:2,5但是仍有许多人不能答对,也包括当初的我。这道题简简单单,但是考察了不少于如下内容:数组指针、数组首地址概念、数组指针和数组首地址和数组首元素地址之间的关系,指针运算规则,指针类型,int型长度,指针长.. 阅读全文
posted @ 2013-07-05 10:54 z折腾 阅读(215) 评论(0) 推荐(0)
摘要:getopt表头文件#include<unistd.h>定义函数intgetopt(intargc,char*constargv[],constchar*optstring);externchar*optarg;externintoptind,opterr,optopt;函数说明getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring为选项字符串,告知getopt()可以处理哪个选项以及哪个选项需要参数,如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,全域变量optarg即会指向此额外参数。如果在处理期间遇 阅读全文
posted @ 2013-05-30 22:05 z折腾 阅读(217) 评论(0) 推荐(0)
摘要:STL之二:vector容器用法详解vector类常用的函数如下所示构造函数增加函数删除函数遍历函数判断函数大小函数其他函数示例初始化示例增加及获得元素示例修改元素示例删除向量示例进一步理解vector如下图所示综合示例vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组。像数组一样,vector类也用从0开始的下标表示元素的位置;但和数组不同的是,当vector对象创建后,数组的元素个数会随着vector对象元素个数的增大和缩小而自动变化。 vector类常用的函数如下所示: 1.构造函数vector():创建一个空vectorvector(int nSize):创建一个v 阅读全文
posted @ 2013-04-25 22:25 z折腾 阅读(289) 评论(0) 推荐(0)