C++类与继承
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++类总结
类中创建的每一个新对象都有自己的存储空间,用于存储其内部变量和类成员,但同一个类的所有对象共享同一组类方法,即每种方法只有一个副本。
Const 成员函数
例const Stock land = Stock (“Kludgehorn Properties”);
land.show();
第二句将拒绝编译,show()的代码无法保证被调对象不被修改,所以要这样声明show() Void show()const;
构造函数的参数不是类成员,而是赋给类成员的值,因此参数名不能与类成员名相同。
构造函数的使用分为显式和隐式。
显式例:Stock food =Stock (“world cabbage”,250,1.25);
隐式例:Stock garment(“furry mason”,50,2.5);
用new创建类对象时,C++都将使用类构造函数。
例:Stock *pstock=new Stock(“electroshock games”,18,19.0);
当且仅当没有定义任何构造函数时,编译器才会提供默认构造函数。为类定义了构造函数后,程序员就必须为它提供默认构造函数。
构造函数不仅仅可用于初始化新对象,还可以用来对已有对象赋值。例如stock1为已有对象。Stock1=stock(“nifty foods”,10,50.0);
析构函数的用途:做类的善后处理。例如构造函数使用new来分配内存,则析构函数将使用delete来释放这些内存。
每个成员函数(包括构造函数和析构函数)都有一个this指针。This指针指向调用对象。如果方法需要引用整个调用对象,则可以使用表达式*this。在函数的括号后面使用const限定符将this限定为const,这样将不能使用this来修改对象的值。
如const stock & topval(const stock & s)const;
要创建对象数组,则这个类必须有默认构造函数。
当想创建一个由所有对象共享的常量时不可以直接用如const int len =30;的方式。可以通过枚举enum {len=30};或使用static关键字static const int len =30;(此时len与其他静态变量存储在一起,而不是存储在类对象中。
运算符重载限制
1.重载运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准型重载操作
符。
2.使用操作符时不能违反操作符原来的句法规则。不能修改操作符的优先级。
3.不能定义新的操作符。
4.不能重载下面的操作符。“Sizeof”“.”(成员操作符)
“.*”(成员指针操作符) “::”(作用域解析操作符) “?:”(条件操作符)
typeid(一个RTTI操作符),
const_cast(强制类型转换操作符),
dynamic_cast(强制类型转换操作符),
reinterpret_cast(强制类型转换操作符),
static_cast(强制类型转换操作符)
5.大多数操作符都可以通过成员或非成员函数进行重载,但下面的操作符只能通过成员函
数进行重载:“=”“()”“[]”“->”
友元
友元函数:可以访问类的私有成员的非成员函数。
不可以在定义中使用关键字friend。
友元类:当两个类不属于is-a关系时可申明友元类。friend class remote;
友元声明可以位于公有,私有或保护部分,其所在的位置无关紧要。友元类可以访问私有函数。
友元成员函数:类中的成员函数可以声明为其他类的友元函数。
Class tv;
Class remote{};
Class tv
{
Friend void remote::set_chan(tv & t,int c);
}
注意类的声明次序
类的自动转换和强制类型转换
C++语言不自动转换不兼容的类型。例如int *p=10;是非法的,左边为指针类型右边为int 型。
C++程序员可以指示C++如何自动进行类的类型转换或强制类型转换。
接受一个参数的构造函数为将类型与该参数相同的值转换为类提供了方法。
例class stonewt
{
。。。。
stonewt(double lbs);
}
stonewt mycat;
mycat =19.6;
在例中构造函数被隐式调用了将19.6转化为类类型。
有时不需要这种隐式的转化,在声明构造函数时使用explicit关键字关闭这种特性。
例如:用explicit stonewt(double lbs);声明构造函数。
则stonewt mycat;
mycat =19.6;wrong
mycat=stonewt(19.6);right
mycat=(stonewt)19.6;right
当stonewt(double)没有用explicit声明时,可用于下面的隐式转换。
1.将stonewt对象初始化为double值时。
2.将double值赋给stonewt对象时。
3.将double值传递给接受stonewt参数的函数时。
4.返回值被声明为stonewt的函数试图返回一个double值时。
5.在上述任意一种情况下,使用可转换为double类型的内置类型时。
例如stonewt jumbo(7000);
Jumbo=7300;
如果想将类类型转化到别的类型可使用转换函数,转换函数使用户定义的强制类型转换。Operator typename()例如可以在类中声明operator double();函数,将类类型转化为double 类型。
在类中的静态成员(static),无论创建了多少对象,程序都只创建一个静态类变量副本。也就是说类的所有对象共享同一个静态成员。不能在类声明中初始化静态成员变量。这是因为声明描述了如何分配内存,但并不分配内存。可以用如下语句初始化:
typename classname ::variable =value;
默认构造函数
如果不提供任何构造函数,c++将创建默认构造函数。默认构造函数使类类似一个常规的自动变量,也就是说,它的值在初始化时是未知的。定义默认构造函数时可以没有任何参数,也可以有参数,但所有参数都要有默认值。如:
Stonewt (){};stonewt(int n=0){stonewt_ct =0};
复制构造函数
复制构造函数用于将一个对象复制到新创建的对象中。也就是说,它用于初始化过程中。而不是常规的赋值过程。类的复制构造函数原型通常如下:
Class_name (const class_name &);
特别注意:
Classname & classname::functionname(const classname & variable)该函数返回的是指向该类对象的引用。
类的继承:
派生类不能直接访问积累的私有成员,而必须通过基类进行访问:例如father为基类,son 为派生类,father的私有成员为fn,ln,ht。son的私有成员为r。构造函数应为:
Son ::son(unsigned int r,const char * fn,const char *ln,bool ht):father(fn,ln,ht);
派生类构造函数的要点如下:
1,基类对象首先被创建。2,派生类构造函数应通过成员初始化列表降级类信息传递给积累构造函数。3,派生类构造函数应该初始化派生类新增的数据成员。
类和基类之间有一些特殊的关系。
1,派生类对象可以使用基类的方法(不是私有方法)
2,基类指针可以在不进行显示类型转换的情况下指向派生类对象。
3,基类引用可以在不进行显示类型转换的情况下引用派生类对象。
但是,基类指针或引用只能调用基类方法。
继承关系分为三种:
公有继承,is-a关系:派生类对象也是一个基类对象,可以对基类对象执行的任何操作也可以对派生类对象执行。
多态
1在派生类中重新定义基类的方法。2使用虚方法(virtual)。
如果没有关键字virtual程序将根据引用类型或指针类型选择方法,如果使用了virtual程序将根据引用或指针指向的对象的类型来选择方法。
基类中声明虚析构函数,保证释放派生对象时按正确顺序调用析构函数。