2013年4月10日

摘要: #include <iostream> using namespace std; class Base1 { public: virtual void f() { cout << "Base1::f" << endl; } virtual void g() { cout << "Base1::g" << endl; } virtual void h() { cout << "Base1::h" << endl; } }; class Base2 { p 阅读全文
posted @ 2013-04-10 22:50 江在路上 阅读(127) 评论(0) 推荐(0) 编辑
 
摘要: 1、多重继承(无虚函数覆盖)下面,再让我们来看看多重继承中的情况,假设有下面这样一个类的继承关系。注意:子类并没有覆盖父类的函数。对于子类实例中的虚函数表,是下面这个样子:我们可以看到:1)每个父类都有自己的虚表。2)子类的成员函数被放到了第一个父类的表中。(所谓的第一个父类是按照声明顺序来判断的)这样做就是为了解决不同的父类类型的指针指向同一个子类实例,而能够调用到实际的函数。2、多重继承(有虚函数覆盖)下面我们再来看看,如果发生虚函数覆盖的情况。下图中,我们在子类中覆盖了父类的f()函数。下面是对于子类实例中的虚函数表的图:我们可以看见,三个父类虚函数表中的f()的位置被替换成了子类的函数 阅读全文
posted @ 2013-04-10 22:49 江在路上 阅读(90) 评论(0) 推荐(0) 编辑
 
摘要: 1、没有任何数据成员和成员函数的空类#include <iostream.h> #include <string.h> class A{};void main(void) { cout << sizeof(A) << endl; // 1 ,为什么是1,不懂啊 return; }2、为类A添加一个非虚函数#include <iostream.h> #include <string.h> class A{public: int add(int i) { return ++i; }};void main(void) { cou 阅读全文
posted @ 2013-04-10 21:47 江在路上 阅读(208) 评论(0) 推荐(0) 编辑
 
摘要: #include <iostream.h> #include <string.h> void fun(char str[6])//退化为指针{ cout << sizeof(str) << endl;}void main(void) { char str[13]="Hello world!"; char *pStr="Hello world!"; cout<<sizeof(str)<<endl; cout<<sizeof(pStr)<<endl; cout&l 阅读全文
posted @ 2013-04-10 20:03 江在路上 阅读(140) 评论(0) 推荐(0) 编辑
 
摘要: volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。例如:volatile int i=10;int j = i;...int k = i;volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把 阅读全文
posted @ 2013-04-10 19:35 江在路上 阅读(135) 评论(0) 推荐(0) 编辑
 
摘要: C运算符优先级:*和++优先级相同,从右到左结合顺序计算,*p++ 相当于 *(p++),*++p相当于*(++p),++*p相当于++(*p)。#include <iostream.h>int main(){ char s[] = "012345678", *p = s; cout << *p++ << *(p++) << (*p)++ << *++p << *(++p) <<++*p << ++(*p) << endl; return 0;}VC++6 DEBUG 阅读全文
posted @ 2013-04-10 16:04 江在路上 阅读(646) 评论(0) 推荐(0) 编辑
 
摘要: 一 通常的函数调用 一个通常的函数调用的例子://自行包含头文件void MyFun(int x); //此处的申明也可写成:void MyFun( int );int main(int argc, char* argv[]){MyFun(10);//这里是调用MyFun(10);函数 return 0;}void MyFun(int x) //这里定义一个MyFun函数{ printf(“%d\n”,x);} 这个MyFun函数是一个无返回值的函数,它并不完成什么事情。这种调用函数的格式你应该是很熟悉的吧!看主函数中调用MyFun函数的书写格式:MyFun(10); 我们一开始只是从功能上或 阅读全文
posted @ 2013-04-10 15:23 江在路上 阅读(86) 评论(0) 推荐(0) 编辑
 
摘要: if语句是C++/C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式写if语句。本节以“与零值比较”为例,展开讨论。4.3.1布尔变量与零值比较&#61548;【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为TRUE)。TRUE的值究竟是什么并没有统一的标准。例如Visual C++ 将TRUE定义为1,而Visual Basic则将TRUE定义为-1。假设布尔变量名字为flag,它与零值比较的标准if语句如下:if (flag) // 表示flag为真if (!fla 阅读全文
posted @ 2013-04-10 14:24 江在路上 阅读(352) 评论(0) 推荐(0) 编辑
 
摘要: operator的一个用途是用于类型转换函数:类型转换函数的特征:1)类型转换函数定义在源类中;2)须由operator修饰,函数名称是目标类型名或目标类名;3)函数没有参数,没有返回值,但是有return语句,在return语句中返回目标类型数据或调用目标类的构造函数。类型转换函数主要有两类:1)对象向基本数据类型转换:2) 对象向不同类的对象的转换:简单的例子#include <iostream>using namespace std;class CArea{ float area;public: CArea() { area... 阅读全文
posted @ 2013-04-10 13:26 江在路上 阅读(412) 评论(0) 推荐(0) 编辑
 
摘要: 用法:const_cast<type_id> (expression)该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。一、指向常量的指针被转化成指向非常量的指针,并且仍然指向原来的对象;二、指向常量的引用被转换成指向非常量的引用,并且仍然指向原来的对象;#include<iostream>using namespace std;class B{ public: int m_iNum; B() {}};void foo(){ const B b1; //b1.m... 阅读全文
posted @ 2013-04-10 09:27 江在路上 阅读(122) 评论(0) 推荐(0) 编辑