《VC++深入详解》第二章讲解了C++特性 ,配套的视频讲解的很好,反正我是终于搞明白这些东东了。 学完,反过来写个笔记,就当复习了。
1. 结构体与类
结构体里没法包括函数(所谓方法),类可以。类包含的方法(函数),一般是用来描述对象的行为。
2. 类与对象
类,可以理解为类型,对象则是类的实例。车是一个类,我家的车就是一个具体的对象。车还可以细分为小轿车、大巴车等,小轿车一般有车的共性,再有一些自己的特性,“小轿车”就可以继承”车“的特点,成为”车“的子类,”车“为”小轿车“的父类也称为基类。
3.构造函数construct function
函数名字和类的名字一样
用来初始化类的成员变量,可以带参数,也可以不带参数。具体的作用其实是对对象本身做初始化工作,也就是给用户提供初始化类中成员变量的一种方式。构造函数可以多个,所谓”重载“。
子类的构造函数可以向父类的带参数的构造函数,传递参数。当对父类中的常量成员初始化,也是这种方式。
例如
父类为 animal 子类为fish
fish() : animal(100,20),constvailable(5)
{
}
注意:先执行父类的构造函数,再执行子类的构造函数。
注意:编译器在某些情况下会为该类提供默认的构造函数;但是一旦类中定义了任何构造函数,编译器就不提供默认的构造函数了。
4.析构函数
函数名是构造函数前加一个~ ,表示相反咯
析构函数不允许带参数,而且一个类中只有一个析构函数。
注意:先执行子类的析构函数,再执行父类的析构函数。 从外往里建,从里往外拆。
5.函数的重载
就是函数名一样,返回值类型相同,只有参数的类型可以不同或者参数的个数不同。
void output(); int output();
不可以构成函数的重载,返回值不同。
void output(int a , int b=5);void output(int a , int b);
不可以构成函数的重载,带默认参数的参数可以被忽略,调用会有歧义。
6.函数的覆盖
在类中定义函数时,加上virtual 标志,表示该函数为虚函数。 例如: virtual void output( ) { cout << "happy"<<endl ; }
在该类的派生类(子类)中,可以重写该函数(函数名和参数列表都相同)。那么子类的对象,在调用该函数时,则是执行覆盖后的函数,即子类中重写后的函数。
作用是:当觉得父类中的某些方式(函数)的具体内容不适合子类,则可以在子类中重写。可以在重写的函数中调用父类的原函数,达到二者兼具的效果。
比如 父类animal 子类fish 重写breathe()
void breathe( )
{
animal::breathe(); //调用父类 的breathe()
cout << "fish bubble "<<endl;
}
注意:覆盖发生在子类和父类之间,重载则是在一个类中。
7.多态性
纯虚函数 形式如: virtual void output =0 ;
可以在子类中重写父类的纯虚函数,其实对虚函数的重写也是一样的。运行时,会根据对象的实际类型来调用相应的函数。
如果父类中是纯虚函数,子类必须将其具体化(重写该函数)以后,才可以实例化对象,该父类也无法实例化对象。
书中的例子很好说明了这点,代码贴上来:
class Animal
{
public:
Animal(int height,int weight);
void eat();
void sleep();
virtual void breathe();//=0;
};
Animal::Animal(int height,int weight)
{
}
void Animal::eat()
{
cout<<"animal eat"<<endl;
}
void Animal::sleep()
{
cout<<"animal sleep"<<endl;
}
void Animal::breathe()
{
cout<<"aniaml breathe"<<endl;
}
class Fish : public Animal //Fish 继承了Animal
{
public:
Fish();
void breathe();
};
Fish::Fish():Animal(300,400)
{
}
void Fish::breathe()
{
cout<<"fish bubble"<<endl;
}
void fn(Animal *pAn)
{
pAn->breathe();
}
void main()
{
//Animal an;
//an.eat();
// an.breathe();
Fish fh;
Animal *pAn;
pAn=&fh;
fn(pAn);//原对象指针是子类的,调用函数时,子类有的调用子类的,子类没有则调用父类的。
}
8.引用
引用定义形如:int &b=a; 就是给a定义了而一个别名b,二者共享的是同一内存,所以改变其中一个,另一个也会改变。
而且在定义后,b就一直是a 的引用。
引用的作用是让语意更清晰。