C++的特性

   《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 的引用。

引用的作用是让语意更清晰。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值