欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > c/c++ >内容正文

c/c++

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

发布时间:2024/1/1 c/c++ 54 豆豆
生活随笔 收集整理的这篇文章主要介绍了 孙鑫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);}

总结

以上是生活随笔为你收集整理的孙鑫VC++LESSON2:掌握C++基本语法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。