4期c++9月21号
一、上午教课的第一个重要知识点是抽象类,对于抽象类在课上已经完全掌握,一下是一些重要的点。
抽象类:带有纯虚函数的类称为抽象类
形式:class类名{virtual类型 函数名(参数表)=0;........}
因为我们生活中的抽象类是顶层的基类,所以抽象类只可以给基类来使用。而且不可以定义抽象类的对象,只能声明抽象类的指针。纯虚函数直到被覆盖前所派生的类均为抽象类。
抽象类的作用:把所用的派生类用一个抽象概念,组织在一个继承结构中,保证派生类中和基类相同动作行为。抽象类无法实现的函数,可以声明为纯虚函数,留给派生类去实现。
二、上午的拷贝构造函数接受的不是很多,因此下午我们要求助教老师给我们大白话式的讲了一遍,已经完全接收。
拷贝构造函数(这部分知识上课已经吸收)
对象的赋值:string name;一个已知对象student a(“abcd”)赋值给另一个已知对象。student b; b=a;通过对赋值运算符的重载实现。
对象的拷贝:用一个已知对象student s1(“abcd”)构造或者初始化一个新对象。student s2=s1或者student s2(s1);
拷贝构造函数的形式student(student & s)对象的引用;或者student(const student & s);对象的常引用{常引用中的s不能成为左值}
下午助教老师跟我们重新讲解了关于深拷贝的问题。
目的是要给自己定义一个新的拷贝空间,避免浅拷贝同时指向同一个动态空间。
aa(){f=new char[10];} aa(aa const & s){f=new char[10];strcpy(f,s.f);} ~aa(){delete [ ]f;} char * f;};
int main(){①aa p; strcpy(p.f,"Computer");cout<<p.f<<endl; aa q(p);..
首先①把computer拷贝给p此时p会建立一个空间,执行aa q(p);会先执行拷贝函数,这时q会重新建立一个空间,此时p里的会拷贝到q里,在执行析构函数时,会先析构q空间释放,在析构p空间释放。
三、例题错误:如下循环为3,因此all shapes is 3,结果显示为4.
错误原因:在square调用了rectangle,square里面有count++,并且还会运行rectangle里面的count++,重复了一次。
改正方法:把count++写到基类里面。