类型转换,动态内存

C++的类型转换
(1)用构造函数用于类型转换,如有类Stonewt

Stonewt(double lbs);   //constructor
Stonewt myCat;  //create a Stonewt object
myCat=19.6;     //use Stonewt(double lbs) to convert 19.6 to Stonewt

若使用explicit关键字将关闭隐式的自动转换
explicit Stonewt(double lbs); //no implicit conversion allowed
(2)转换函数:将类对象转换为int 或double类型时,需在原型中添加类声明

operator int();
operator double();

Stone::operato int()
{
    return int(x+0.5);
}
Stone::operator double()
{
    return double(x);
}

动态内存和类
(1)静态类成员的特点:无论创建了多少对象,程序都只创建一个静态变量副本。不能再类声明重初始化静态变量,因为声明描述了如何分配内存,但并不分配内存,初始化一般在.cpp中,且不使用static关键字。
(2)默认构造函数:如果没有提供任何构造函数,C++将创建默认构造函数;该函数不接受任何参数也不执行任何操作。带参数的构造函数也可以是默认构造函数,只要所有参数是默认值。只能有一个构造函数。
(3)复制构造函数:用于将一个对象复制到新创建的对象中,即用于初始化过程中(包括安值传递),二不是常规的复制过程中。原型:

Class_name(const Class_name &);

新建一个对象并将其初始化为同类对象时,复制构造函数都将被调用。
如果类中包含了使用new初始化的指针成员,应当定义一个复制构造函数,以复制指向的数据而不是指针,这叫深度复制。
类继承

class RatedPlayer:public TableTennisPlayer
{
   ....
};

冒号“:”指出RatedPlayer类的基类是TableTennisPlayer类,派生类对象存储了基类的数据成员,但不能直接访问,必须通过基类来访问;派生类对象可以使用基类的方法;派生类需要自己的构造函数;派生类可以根据需要添加额外的数据成员和成员函数。
(1)权限的考虑:派生类不能直接访问基类的私有成员,而必须通过基类进行访问。派生类构造函数必须使用基类的构造函数。
必须首先创建基类对象,如果不调用基类构造函数,程序将使用默认的基类构造函数。除非要使用默认的构造函数,否则应该显式调用正确的基类构造函数。
(2)派生类构造函数的要点:
首先创建基类对象;派生类的构造函数应通过成员初始化列表将基类的信息传递给基类构造函数,而且应该初始化派生类新增的数据成员。
(3)基类指针可以在不进行显式类型转换的情况下指向派类生对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。
基类指针只能用于调用基类方法,不可以将基类对象和地址赋给派生类引用和指针。基类引用定义的函数或指针参数可用于基类对象或派生类对象
(4)如果没有关键字virtual 程序将根据引用类型或指针类型选择方法;如果使用了virtual,程序将根据引用或指针指向的对象的类型来选择方法。virtual只用于类声明的方法原型中。
经常在基类中将派生类会重新定义的方法声明为虚方法(加上关键字virtual);方法在基类中被声明为虚的后,他在派生类中自动成为虚方法。
基类声明一个虚的析构函数是为了确保释放派生对象时按照正确的顺序释放析构函数
(4)函数名联编(binding):将源代码中的函数调用解释为执行特定的函数代码块。
静态联编:在编译过程中进行的联编;编译器对非虚方法使用静态联编。
动态联编:使用virtual关键字声明的函数使用的是动态联编,编译器必须生成能够在程序运行时选择正确的虚方法的代码。
将派生类引用或指针转换为基类引用或指针称为向上强制转换,这使公有继承不需要进行显式转换;将基类指针或引用转换为派生类指针或引用称为向下强制转换,需要使用显示类型转换。
使用基类引用或指针作为参数的函数调用将进行向上转换。
隐式向上强制类型转换使基类指针或引用可以指向基类对象或派生类对象。
(5)如果要在派生类中重新定义基类的方法,则将它设置为虚方法,否则设置为非虚方法。
通常应该给基类提供一个虚析构函数,即使他并不需要析构函数。但是构造函数不能为虚函数。
友元不能是虚函数,因为友元不是类成员,只用成员才能是虚函数。

protected关键字
派生类的成员可以直接访问基类的保护成员,但是不能访问基类的私有成员。对于外部世界来说,保护成员的行为与私有成员相似,对于派生类来说,保护成员的行为与公有成员相似。

抽象基类(Abstract Base Class:ABC)
从很多个类中抽象出他们的共性,将这些特性放在一个ABC中,即可构成一个抽象基类(ABC);
纯虚函数: virtual datatype func() const=0;
包含基函数的类只用作基类,要成为真正的ABC必须至少包含一个纯虚函数。

const
Star::Star(const char * s){....}     //won't change the string to which s points
void Star::show()  const {....}     //不改变调用他的对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值