C++学习笔记摘录十四.docx
- 文档编号:30460487
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:20
- 大小:20.16KB
C++学习笔记摘录十四.docx
《C++学习笔记摘录十四.docx》由会员分享,可在线阅读,更多相关《C++学习笔记摘录十四.docx(20页珍藏版)》请在冰豆网上搜索。
C++学习笔记摘录十四
C++学习笔记
SkySeraph2010-7-31阅读整理
摘自:
十九章:
代码重用
1:
以前学的过类包含简单复习
#include
usingnamespacestd;
classA
{
public:
A()
{
x=0;
}
A(inti)
{
x=i;//通过下面的带参数的构造函数传递进来的值赋值给私有成员变量x然后就可以通过get函数获取x的值
}
voidGet()
{
cout< } ~A(){} private: intx; }; classB { public: B() { y=0; } B(inti,intj,intk): a(i),b(j)//把参数i和j的值传递给对象ab的带参数的构造函数 { y=k; } AGetA() { returna;//返回对象a } AGetB() { returnb; } intGetY() { returny; } private: Aa;//定义类A的对象a和b Ab; inty; }; intmain() { Bb(1,2,3); b.GetA().Get();//相当于Aa (1)a.Get b.GetB().Get();//这里就是b相当于Ab (2)b.get cout< return0; } 2: 将String类作为包含类... #include"String.h"//将上一节写的String类作为头文件包含进来 classBook { public: Book(); Book(char*,char*,char*,float); constString&GetTital()const//定义一个返回常量他们返回的值不可改变,切获取私有变量的各个值 赋值构造函数的申明如下String(constString&rs) { returnTital; } constString&GetAuthor()const { returnAuthor; } constString&GetNumber()const { returnNumber; } floatGetPrice()const { returnPrice; } voidSetTital(constString&STital)//为私有变量设置一个值 他有一个参数! { Tital=STital; } voidSetAuthor(constString&SAuthor) { Author=SAuthor; } voidSetNumber(constString&SNumber) { Number=SNumber; } voidSetPrice(floatSPrice) { Price=SPrice; } voidSetTotal(constString&ST,constString&SA,constString&SN,floatSP)//一次性设置所有,上面是一个一个设置这里是直接设置全部按需操作! { Tital=ST; Author=SA; Number=SN; Price=SP; } private: StringTital;//定义三个String类的对象和一个book类的成员变量。 StringNumber; StringAuthor; floatPrice; }; Book: : Book(): Tital(""),Author(""),Number(""),Price(0){}//初始化构造函数! Book: : Book(char*tital,char*author,char*number,floatprice): Tital(tital),Author(author),Number(number),Price(price){}//初始化带参数的构造函 intmain() { BookLove("love","jacky","001",34.1f);//传递值, cout<<"书名: "< "< "< "< Love.SetTotal("Hat","Aoutho","002",44.5f); cout<<"书名: "< "< "< "< BookHat=Love;//使用了operator=的重载函数! cout<<"书名: "< "< "< "< if(Love.GetNumber()==Hat.GetNumber()) { cout<<"两本书的编号相同! ...\n"; } else { cout<<"两本书的编号不相同! ...\n"; } Hat.SetNumber("003"); if(Love.GetNumber()==Hat.GetNumber())//使用了operator==重载构造函数! { cout<<"两本书的编号相同...\n"; } else { cout<<"两本书的编号不相同...\n"; } return0; } 3: 为BOOK类重载执行相加运算符 在String.h头文件中添加以下代码: Stringoperator+(constString&)const;//const放在函数体前面表示该函数可以被String类的const对象调用。 函数名后面括号内的const表示该函数的接受参数是一个String类的const对象 在下面定义这个函数: StringString: : operator+(constString&rhs)const//定义一个可以被const对象所调用的operator函数 { intTotal=len+rhs.GetLen(); StringTemp(Total); inti,j; for(i=0;i { Temp[i]=str[i]; } for(j=0;j { Temp[i]=str[j]; } Temp[Total]='\0'; returnTemp; } CPP代码如下: #include"String.h"//将上一节写的String类作为头文件包含进来 classBook { public: Book(); Book(char*,char*,char*,float); constString&GetTital()const { returnTital; } constString&GetAuthor()const//当然你也可以去掉两边的const把他设置为非const对象调用! { returnAuthor; } constString&GetNumber()const { returnNumber; } floatGetPrice()const { returnPrice; } voidSetTital(constString&STital) { Tital=STital; } voidSetAuthor(constString&SAuthor) { Author=SAuthor; } voidSetNumber(constString&SNumber) { Number=SNumber; } voidSetPrice(floatSPrice) { Price=SPrice; } voidSetTotal(constString&ST,constString&SA,constString&SN,floatSP) { Tital=ST; Author=SA; Number=SN; Price=SP; } private: StringTital; StringNumber; StringAuthor; floatPrice; }; Book: : Book(): Tital(""),Author(""),Number(""),Price(0){} Book: : Book(char*tital,char*author,char*number,floatprice): Tital(tital),Author(author),Number(number),Price(price){} intmain() { BookLove("love","jacky","001",34.1f);//传递值, BookHat("Hat","Milk","002",44.2f); StringHatAndLove=Hat.GetAuthor()+Love.GetAuthor(); //假如我们不修改String.h而使用BookHatAndLove=Hat.GetAuthor()+Love.GetAuthor()//那么编译器就会报错因为 constString&GetAuthor()const和我们定义的重载函数不一样,所以我们要在头文件的14行在加一个可以操作类const对象的函数. return0; }//当然由于我们创建了三个String类所以我们的内存消耗也是很严重的。 因为String类对象要先被初始化然后才是定义三个String类对象,所以我们看到循环了两次。 下面解决: 4: 按别名传递book对象。 #include"String.h"//将上一节写的String类作为头文件包含进来 classBook { public: Book(); Book(char*,char*,char*,float); constString&GetTital()const { returnTital; } constString&GetAuthor()const { returnAuthor; } constString&GetNumber()const { returnNumber; } floatGetPrice()const { returnPrice; } voidSetTital(constString&STital) { Tital=STital; } voidSetAuthor(constString&SAuthor) { Author=SAuthor; } voidSetNumber(constString&SNumber) { Number=SNumber; } voidSetPrice(floatSPrice) { Price=SPrice; } voidSetTotal(constString&ST,constString&SA,constString&SN,floatSP) { Tital=ST; Author=SA; Number=SN; Price=SP; } Book&operator=(constBook&s);//重载函数 Book(constBook&rs);//复制构造函数! private: StringTital; StringNumber; StringAuthor; floatPrice; }; Book: : Book(): Tital(""),Author(""),Number(""),Price(0){} Book: : Book(char*tital,char*author,char*number,floatprice): Tital(tital),Author(author),Number(number),Price(price){} Book&Book: : operator=(constBook&s) { cout<<"Book类operator=()函数执行。 \n"; Tital=s.GetTital(); Author=s.GetAuthor(); Number=s.GetNumber(); Price=s.GetPrice(); return*this; } Book: : Book(constBook&rs): Tital(rs.GetTital()),Author(rs.GetAuthor()),Number(rs.GetNumber()) { cout<<"BOOK类的复制构造函数执行...\n"; } voidPrintF1(Bookone); voidPrintF2(constBook&two); intmain() { BookLove("love","jacky","001",34.1f);//传递值, cout<<"调用printf1输出Love\n"; PrintF1(Love); cout<<"调用printf2输出Love\n"; PrintF2(Love); return0; } voidPrintF1(Bookone)//按值接受一个book类对象并且输出改类的4个成员。 包括3个String类对象和一个Book成员 { cout<<"书名: "< "< "< "< } voidPrintF2(constBook&two)//按引用接受,我们看到他少析构了一次,这样就达到了节约系统资源的功能。 也就是引用方式调用功能。 。 { cout<<"书名: "< "< "< "< 5: 包含指向另一个类的指针 头文件PT.H #include usingnamespacestd; enum{Small,Larger,Same};//枚举型产量,从0到2具体请查看 classDate//数据类 { public: Date(inti): date(i){}//初始化变量i ~Date(){} intCompare(constDate&);//比较函数 voidPrintf()//输出函数 { cout< } private: intdate; }; intDate: : Compare(constDate&two)//比较函数的实现部分。 { if(date { returnSmall; } if(date>two.date)//再次判断是否大于他如果大于就返回Larger也就是大。 { returnLarger; } else//不然的话就只剩下一个结果就是相同 { returnSame; } } ////我是邪恶的分割线 classNode//定义一个抽象类。 他有两个虚函数。 抽象类用作提供接口不做任何作用。 { public: Node(){} virtual~Node(){} virtualNode*Insert(Date*one)=0; virtualvoidPrintf()=0; }; ////我是邪恶的分割线 classInterNode: publicNode { public: InterNode(Date*one,Node*Next);//构造函数的两个参数一个是Date数据类和节点类Node的指针、。 ~InterNode()//析构函数使用完毕后删除这两个指针 { deleteNext; deletethisdate; } virtualNode*Insert(Date*one);//申明一个按指针方式传递(Date*one)和返回(*Insert)的虚函数Insert virtualvoidPrintf()//覆盖掉基类的纯虚函数让它实例化 { thisdate->Printf();//使用Date类的指针指向Printf函数和使用Node类的指针指向Printf函数让他们各自输出值。 Next->Printf(); } private: Date*thisdate;//分别指向不同类的指针. Node*Next; }; InterNode: : InterNode(Date*one,Node*next): thisdate(one),Next(next){}//中间类的InterNode当为这个类传递默认构造函数的参数时候他会初始化Date的自身Date指针和利用next指针初始化Next指针 Node*InterNode: : Insert(Date*one)//定义一个Insert插入虚函数,他返回一个Node类指针。 他接受一个Date指针。 { intresult=thisdate->Compare(*one);//进入Date类中的Compare函数判断他们的返回值 switch(result)//如果是Same就啥都不执行。 { caseSame: break; caseLarger: //如果是Larger就执行。 也就是通过上面的比较函数代码我们知道,如果传递进来的值大于或者等于,那么就执行, { InterNode*NodeDate=newInterNode(one,this);//创建一个新空间,并且让初始化InterNode的构造函数。 然后把他返回给InterNode类的指针NodeDate;这样,one用来初始化改对象的thisdate而this用来初始化该对象Next指针 returnNodeDate; } caseSmall: //加入小于就执行下面的! Next=Next->Insert(one); returnthis; } returnthis; } ////我是邪恶的分割线 classTailNode: publicNode { public: virtualNode*Insert(Date*one); virtualvoidPrintf(){} private: }; Node*TailNode: : Insert(Date*one) { InterNode*datanode=newInterNode(one,this); returndatanode; } ////我是邪恶的分割线 classHeadNode: publicNode//派生类。 { public: HeadNode(); ~HeadNode() { deleteNext;//删除指针... } virtualNode*Insert(Date*one); virtualvoidPrintf() { Next->Printf(); } private: Node*Next;//指向基类Node的Next指针。 }; HeadNode: : HeadNode() { Next=newTailNode;//在椎中创建控件,并且由指向类Node的指针Next来指向他。 } Node*HeadNode: : Insert(Date*one) { Next=Next->Insert(one);//我们看到由于Next是指向下面TailNode也就是尾节点的所以他会调用尾节点的Insert函数来进行数据插入 returnthis; } ////我是邪恶的分割线 classLinkeListt//链表类.他有4个功能,创建头节点,并且用一个指针指向他,将数据传递给头节点,调用头节点的输出函数,删除头节点 { public: LinkeListt(); ~LinkeListt() { deleteHead;//当完成类的功能,也就是析构对象的时候我们删除这个指针。 } voidInsert(Date*one);//插入函数,接受指定类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 学习 笔记 摘录 十四