《Hello,World公开课》C++重要特性一览

开课吧开课吧科科2021-03-26 17:23

点赞
有用
分享分享

C++发展到现在已经近40年的历史,Python、Glong各种语言你方唱罢我登场,但无可否认的是,C++依然是目前主流的编程语言,3月25日,开课吧《Hello World公开课》邀请到某大厂AI算法工程师晓沐老师,让他带我们一探C++。

指针与引用

无论是C或C++,指针的话题是永远绕不开的,指针是指可以指向某个地址的32比特的变量,这个变量存的是内存的地址。下面我们来看看指针类型和指针常见的问题。

指针类型

  • 普通指针:int* p;
  • 指针的指针:int** p;
  • 指针数组:int* p[5];
  • 数组指针:int (*p)[5];
  • 指针函数:int* func();
  • 函数指针:int (*func)();
  • 万能指针:void* p;
指针常见问题

空指针

int*a=NULL;
printf("%d",(*a));

指针未初始化

int* b;
printf("%d",(*b));

指针指向混乱

int a=3,b=4;
int x[4]={3,5,6,8};
int *C=&a,*d=&b;
c=x+3;
d=c-1;

多级指针混乱

int a=1;
int*b=&a;
int**c=&b;
int*** d=&c;
cout<<**d<<endl;
引用

在了解了指针的常见问题后,我们来看看在引用时,应该有哪些地方需要被注意的

  • 指针的值可以为空,引用的值不能为空
  • 指针可以在任何时间被初始化,引用必须在创建时被初始化
  • 指针的值在初始化后可以改变,引用在初始化后不可以改变
  • 指针可以是多级,引用只能是一级
  • 引用是一个变量的别名,常用于函数参数返回值

面向过程编程与面向对象编程

面向对象是一种 对现实世界理解和抽象的方法,面向过程 是一种以过程为中心的编程思想。这么说可能太抽象了,我们以下面这个图为例

面向过程编程就像左边这样,我们达到某个目的只需定义好操作步骤,比如把大象装进冰箱要分3步,但面向对象编程是定义了人,冰箱,大象这些对象。在编程时会详细说明人是如何一步一步把大象装进冰箱的。

面向对象

这就带来了面向对象编程的三个重要特性,封装、继承、多态

  • 封装:隐藏对象的属性和实现细节,仅对外公开结构,控制在程序中属性的读和修改的访问级别
  • 继承:子类继承父类的特征和行为,使子类对象实例具有父类的属性和方法。
  • 多态:为不同数据类型的实例提供统一的接口

函数重载与运算符重载

函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被成为重载函数,通过重载不同参数的同名函数,可以令代码更为直观,为访问者带来便利。如下列代码我们定义了两个add函数分别计算整数加法和浮点数加法

int add(int a,int b)
{
  return a+b;
}
int add(int a,int b,int c)
{
  return a+b+c;
}
float add(float a,float b)
{
  return a+b;
}
float add(float a,float b,float c)
{
  return a+b+c;
}

运算符重载与函数重载类似,不过它重载的对象是运算符,下列代码是C语言中两个类的相加

int main()
{
  vec v1(1,3),v2(3,5);
  vec v3=v1+v2;
  cout << v3.x<<end1;
  cout<<v3.y<<end1;
}

但我们都知道,在C++中加法运算是不支持两个类直接相加的,这时候就用到了运算符重载

class vec{
public:
  int x,y;
  vec(int x,int y)
    :x(x),y(y){}
}

vec operator + (const vec & a,
                const  vec& b){
  int x=a.x+b.x;
  int y=a.y+b.y;
  vec ret(x,y);
  return ret;
 }

模板编程

在前面,我们定义了两个add方法,分别计算整数和浮点数加法

int add(int a,int b)
{
  return a+b;
}

float add(float a,float b)
{
  return a+b;
}

但这个方式还是有些冗余,有没有什么办法可以让代码变得更简洁一些呢,比如可以同时把int类型和float类型的数据直接相加,这时候就用到了模板编程,如下代码,我们定义一个template模板,分别有T1,T2两个参数,这两个参数可以是int类型也可以是float类型。

template<typename T>
class vec{
public:
  T a,b;
  Vec(T a,T b):a(a),b(b){}
}

template<typename T1,typename T2>
T1 add(T1 a,T2 b)
{
  return a+b;
}

常用标准模板库(STL)

容器

Vector

list

deque

stack

queue

priority_queue

set/hash_set

map/hash_map

迭代器

iterator

const_iterator

reverse_iterator

const_reverse_iterator

算法

sort

find

reverse

binary_search

讲师介绍

晓沐老师,BAT某厂人工智能研究院CV算法工程师,北京航空航天大学智能信息处理方向硕士,主要研究方向是物体检测、语义分割、三维重建等,具有丰富的移动端C++算法落地经验;同时具备多年授课经历,有丰富的技术研讨和教学经验。

《Hello ,World公开课》是由开课吧推出的面向广大开发工程师的免费加餐课,集结业内名师大咖,聚焦热门技术和实战解决方案,以专业知识分享交流为桥梁,链接正在创造世界的一群科技主力们,向初心致敬,为技术发烧。无论你是初入职场的应届生,还是准备升职加薪的职场精英,相信这里都有你需要的养料。

更多《Hello,World公开课》尽在开课吧广场动态信息频道!

 

有用
分享