孙鑫VC++LESSON2:掌握C++基本语法

LESSON2:https://www.bilibili.com/video/BV1Ts411f7fw?p=2&vd_source=04d791790ccb453dc9e7113022339213
在这里插入图片描述
  在c++中结构体和类是可以通用的,对于结构体来说,他所有的成员和成员函数都是默认public的,而对于类来说默认的都是private的。
  通常,产生一个类的对象,也就是这个类的一个实例化,对象等同于实例化。

  面向过程是什么,就是对事件的过程进行编程,我们已知事件的发展过程,我们根据过程发展的节点去编程。整个编程是过程驱动,开始,然后输入数据,然后处理,最后结束,或者反复循环这种。C程序就是面向过程的,一次只做一件事情,比如空调,或者一些内嵌小程序的东西就是C程序,通俗易懂的例子就是计算器,输入数字,运算符号,再输入数字,再等于,最后结果,如果中途输错就归零然后重新来。
  后来算法越来越复杂,指数型的增长,为了解决复杂算法编程,所以出现面向对象编程,面向对象是事件驱动的。
就想手机一样,手机中很多不同的模块,每个用户都不一样,每天用手机的过程也不一样,不能像计算器那样用。也可以这样理解,算法复杂度越来越高,代码越来越长,我们就将其写成封装起来,然后又很多这种封装的程序,再写需要的程序时,有选择的调用这些封装起来的程序。是面向一个个对象的。
  知乎上有一个例子说区分这两个,取得例子是狗摇尾巴,很形象。
  面向过程就是摇(狗,尾巴);面向对象就是狗.摇尾巴()。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
  这两种情况都不行,编译器分不清调用哪一个。
在这里插入图片描述
  这里注意变量可见性的问题,可以加添this指针,或者形参改成a,b
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  如果是public都可以访问;如果是protected子类可以访问,外部不可以访问;如果是private,子类也不能访问。
在这里插入图片描述
  对于基类和派生类中均有构造函数时,如果在main函数里构建了一个派生类对象,这是会先调用基类的构造函数,在调用派生类的构造函数,因为必须要先创建基类才能创建派生类;析构时子类先析构,基类再析构。
在这里插入图片描述

  如果基类里面有定义的带参数的构造函数,这时候构建派生类对象就会找不到默认的无参数的构造函数,需如上图。如果有常量的话,也可以加冒号初始化。
在这里插入图片描述
  函数的重载是发生在一个类之间的,函数的覆盖是父子之间的。子类继承父类,如果某些方法不合适,那么就可以采用函数覆盖进行重写。
在这里插入图片描述
  如果要在父类此方法的基础上加东西,可以用作用域标识符。
在这里插入图片描述
  两个类型能不能转换,一定要看他们的内存模型是不是匹配的,如果不兼容就不能发生。
在这里插入图片描述
  这里调用的是Animal的breath方法。
在这里插入图片描述
  如果我想调用fish的breath方法的话,我可以在Animal的breath前面加一个virtual,是之成为一个虚方法。
在这里插入图片描述
  C++的这种特性也叫做多态性。
在这里插入图片描述
  一个在编译时就确定调用哪个函数,而迟绑定则运行时依据对象类型决定调用那个函数。在基类相应的函数面前加一个virtual,那么子类有的就调用子类的,子类没有的就调用父类的。
  还有一类函数叫纯虚函数,他没有函数体,含有纯虚函数的类叫做抽象类,他不能用来进行实例化,只能用于继承派生类,当我们再设计基类时,如果对某个方法的实施过程不确定,可以先将它设置为纯虚函数,然后在派生类中再进行定义。
在这里插入图片描述
在这里插入图片描述

  引用相当于一个变量的别名,他需要一个变量或对象来初始化自己,并且这种初始化只有在定义的时候进行初始化。
在这里插入图片描述
  c++中没有提供可以访问引用的地址的方法,我们可以理解为引用他不需要内存地址,他不需要占据内存,就是个别名,初始化时联系上a。引用一般用在函数传参,在MFC中,很多的函数都是用的引用来传递,因为这样可以避免发生值得拷贝,因为用的是同一个内存,另外还有一些地方用引用比指针概念更清晰,比如:我们想交换两个数的值

int change(int *a,int *b)
{

}
void main()
{
	int x = 3;
	int y = 4;
	change(&x, &y);
}

  这样写容易分不清是对x,y的地址进行操作,还是值进行操作

int change(int &a,int &b)
{

}
void main()
{
	int x = 3;
	int y = 4;
	change(x, y);
}

  这样写一目了然
  我们一般类和成员函数的定义放在头文件,函数实现放在源文件,注意虚函数定义时加virtual,实现单独提出来时不加virtual。头文件加“”在当前目录下查找,加<>在系统目录下查找,如果不知道在哪里可以统一加“”,先找当前目录,再找系统目录。
在这里插入图片描述
  当子类继承基类的breath时,不管他加不加virtual,他都是一个虚函数。
  如果在头文件中重复包含类的定义的话,会出现重复定义的错误,所以在写头文件时要加预编译指令符#ifndef、#define(宏定义,不用令其 = 1,只是为了避免重复定义)、#endif。
  下面是最终代码:
Animal.h

#ifndef ANIMAL_H_H
#define ANIMAL_H_H
class Animal
{
public:
	Animal(int height,int weight);


	void eat();


	void sleep();
	
	virtual void breathe();//=0;
};

#endif

Animal.cpp

#include "Animal.h"
#include <iostream.h>

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;
}

Fish.h

#include "Animal.h"

#ifndef FISH_H_H
#define FISH_H_H
class Fish : public Animal
{
public:
	Fish();

	void breathe();
};
#endif

Fish.cpp

#include "Fish.h"
#include <iostream.h>
Fish::Fish():Animal(300,400)
{
}

void Fish::breathe()
{
	cout<<"fish bubble"<<endl;
}

Main.cpp

#include <iostream.h>

#include "Animal.h"
#include "Fish.h"

void fn(Animal *pAn)
{
	pAn->breathe();
}


void main()
{
	//Animal an;
	//an.eat();

//	an.breathe();
	Fish fh;
	Animal *pAn;
	pAn=&fh;
	fn(pAn);

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值