扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
第十七天:
当一个类包含其他类时用合成。
当一个类是另一个类的扩展,它包含另一个类的一些属性,另外又增加了一些属性行为用继承。
一个由其他对象合成的对象在它的所有成员对象初始化之前不能被初始化。
构造合成类本身之前应该首先用构造函数初始化表构造成员类。
提供构造整个合成类所需的所有参数,包括构造类中的每个成员类的所需参数。
不需调用成员类的析构函数。
不能访问成员类的私有数据。要想访问它们必须通过调用公有成员函数。
当一个类和另一个类只有个别成员函数或数据成员不同时使用继承的方法。当一个类包含另一个或更多的类时使用合成。但合成类并不仅仅是其他类的功能扩展版本。对于继承构造函数初始化表在建立对象时扮演了重要的角色,当构造一个合成类对象时,则必须肯定所有成员元件都已被构造了。
如果合成类或某个成员元件类包含指针成员,就必须编写重载赋值函数。
第十八天:
在大多数程序中不使用虚函数,就使用静态联编。除非使用了函数指针或是虚函数,否则C/VC++编译器都采用静态联编方式。
静态联编是指在编译时而非运行时确定函数调用。此方法效率高。
动态联编是指在运行时才能确定函数调用。OOP中需要进行动态联编的场合是使用一个指向类家族所有类的指针。只要这个指针指向基类,就能指向任何一个派生类,编译器无法确定指针究竟指向哪个类,直到运行时才能确定。加入Virtual关键字是为了告诉编译器等到运行时在确定哪个函数被调用。基类的还是派生类的函数。
使用Virtual要求动态联编时,VC++在函数调用处插入一个间接指针,不是指向函数首址,而是指向虚拟函数调用地址表(指向函数首址是直接指针)这个表叫做VTABLE(Virtual Table 虚拟表)。在运行时,对象指针触发成员函数在虚拟表中的偏移量调用正确的函数。
纯虚函数不包括任何代码,可以选择给纯虚函数赋0值,从而使编译器不能让用户试图实例化一个包含纯虚函数的基类。
任何包含一个或多个纯虚函数的基类称做抽象基类。不能实例化,成员函数是空的,但可以用它作为它的派生类层次的模式,这样一个基类提供一个所有类家族中类的框架。抽象基类可以列出所有公用数据成员和成员函数,以便派生类继承。
file://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技术内幕』。我会把笔记补上有时间的话。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者