Vb教程 Vb.net教程 Vfp教程 C/C++教程 Vc/Vc++教程 Delphi教程 Java教程 Powerbuilder
  杀毒频道 | 短信频道 | 网络电视 | 论文中心 | 学上网 | 学软件 | 网页特效 | 电脑基础 | 论坛  
  NCRE | 软考 | CET | 职称英语 | 司法考试 | 报关员 | 公务员 | CATTI | CPA考试  
  Html教程 | Css教程 | Xml教程 | Asp教程 | Asp.net | Php教程 | Jsp教程 | Linux教程 | QQ技巧  
Photoshop Illustrator ImageReady Maya教程 3D Max教程 Lightscape Coredraw教程 Authorware Autocad教程 Freehand教程
Access教程 Mysql教程 Sql server Oracle教程 Word教程 Excel教程 Powerpoint Frontpage Asp.net源码 Php源代码
Flash教程 Fireworks Dreamweaver C#教程 outlook教程 系统安装 vbscript教程 Javascript Jsp源代码 Asp源代码
您的位置:首页 >> C/C++教程 >> 正文

『21天精通C++』第三周学习笔记(3-2)
文章来源:互联网

作者:雷神
转载请联系作者

第十七天:

当一个类包含其他类时用合成。
当一个类是另一个类的扩展,它包含另一个类的一些属性,另外又增加了一些属性行为用继承。

一个由其他对象合成的对象在它的所有成员对象初始化之前不能被初始化。
构造合成类本身之前应该首先用构造函数初始化表构造成员类。
提供构造整个合成类所需的所有参数,包括构造类中的每个成员类的所需参数。
不需调用成员类的析构函数。
不能访问成员类的私有数据。要想访问它们必须通过调用公有成员函数。

当一个类和另一个类只有个别成员函数或数据成员不同时使用继承的方法。当一个类包含另一个或更多的类时使用合成。但合成类并不仅仅是其他类的功能扩展版本。对于继承构造函数初始化表在建立对象时扮演了重要的角色,当构造一个合成类对象时,则必须肯定所有成员元件都已被构造了。
如果合成类或某个成员元件类包含指针成员,就必须编写重载赋值函数。

第十八天:

  在大多数程序中不使用虚函数,就使用静态联编。除非使用了函数指针或是虚函数,否则C/VC++编译器都采用静态联编方式。
   静态联编是指在编译时而非运行时确定函数调用。此方法效率高。

  动态联编是指在运行时才能确定函数调用。OOP中需要进行动态联编的场合是使用一个指向类家族所有类的指针。只要这个指针指向基类,就能指向任何一个派生类,编译器无法确定指针究竟指向哪个类,直到运行时才能确定。加入Virtual关键字是为了告诉编译器等到运行时在确定哪个函数被调用。基类的还是派生类的函数。

  使用Virtual要求动态联编时,VC++在函数调用处插入一个间接指针,不是指向函数首址,而是指向虚拟函数调用地址表(指向函数首址是直接指针)这个表叫做VTABLE(Virtual Table 虚拟表)。在运行时,对象指针触发成员函数在虚拟表中的偏移量调用正确的函数。
   纯虚函数不包括任何代码,可以选择给纯虚函数赋0值,从而使编译器不能让用户试图实例化一个包含纯虚函数的基类。

  任何包含一个或多个纯虚函数的基类称做抽象基类。不能实例化,成员函数是空的,但可以用它作为它的派生类层次的模式,这样一个基类提供一个所有类家族中类的框架。抽象基类可以列出所有公用数据成员和成员函数,以便派生类继承。

//Filename: 1206.CPP
#include
#include
#include
#include
int dispMenu(void);
void addParts(void);
void prParts(void);
class inventoryItem{
char partCode[5];
char descrip[20];
int num;
float price;
public:
void addToInv(char P[],char D[],int N,float PR)
{
num=N;
price=PR;
strcpy(partCode,P);
strcpy(descrip,D);
this->toDisk();
}
void toDisk(void)
{
ofstream invOut;
invOut.open ("INV.DAT",ios::app);
invOut.write ((char *)this,sizeof(*this));
}
void getData(void);
};
void inventoryItem::getData (void)
{
ifstream invIn("INV.DAT");
while(invIn)
{
invIn.read((char *)this,sizeof(*this));
if(invIn.good())
{
cout< cout< cout<<"\npart code:"< cout<<"description:"< cout<<"Quantitly:"< cout<<"Price:"< }
}
}
main()
{
int menu;
do
{
menu=dispMenu();
switch(menu)
{
case 1:addParts();
break;
case 2:prParts();
break;
case 3:exit(1);
default:
cerr<<"\n* * * Enter 1,2or3 * * *\n";
}
}while(menu!=3);
return 0;
}
int dispMenu(void)
{
int ans;
cout<<"\n\n功能菜单:\n\n";
cout<<"1.增加记录\n";
cout<<"2.显示记录\n";
cout<<"3.退出\n";
cin>>ans;
return ans;
}
void addParts(void)
{
char pc[5];
char de[20];
int q;
float pr;
inventoryItem part;
cin.ignore ();
cout<<"名称:";
cin.getline(pc,5);
cout<<"说明:";
cin.getline (de,20);
cout<<"数量:";
cin>>q;
cout<<"价格:";
cin>>pr;
part.addToInv (pc,de,q,pr);
}
void prParts(void)
{
inventoryItem part;
part.getData ();
}
 
   『21天精通C++』自学笔记到此就结束了,因是一年多以前的东西了所以不是很完整,当时学的时候只记得虽然书名是21天可雷神共读了三遍用了半年的时间,自以为还没有入门?好象明白了但又什么也不能做,这是怎么回事?雷神一个劲的 @#%$%$@!@@#~¥#。不过以我的性格既然开始了就不放弃,继续学下去,我看的下一本书是『VC技术内幕』。我会把笔记补上有时间的话。

[返回]

编程语言 web开发 数据库 网络技术 操作系统 服务器 网页设计 图形设计 办公软件 常用软件 学电脑

Copyright© www.bianceng.cn Powered by 编程入门网 All Rights Reserved.
关于本站 | 版权声明 | 联系我们 | 友情链接 |
编程入门网 版权所有