一、简介

C++是面向对象编程更注重大局观(架构)忽视细节是一种新的编程方式适合大型软件项目常用于系统开发,引擎开发、嵌入式开发等应用领域, 至今仍然是最受广大程序员喜爱的编程语言之一
特点:【熟悉】
•在支持C的基础上,全面支持面向对象编程

•编程领域广泛,功能强大(最强大的编程语言,没有之一)

•标准保持更新,目前常用的基础标准为ISO C++98标准、ISO C++11标准等

•为数不多的支持底层操作的面向对象语言

•在面向对象的语言中执行效率极高

面向对象:【重点】

面向对象编程(OOP)

OOP是程序设计工程化的一种方法,软件架构的一种思想。

OOP基本原则是程序是由单个能够起到子程序作用的单元或对象组合而成,以达到软件工程的三个主要目标:重用性、灵活性和扩展性。

面向过程 VS 面向对象:【重点】

面向过程:以“怎么解决问题为核心”

面向对象:以“谁来解决问题为核心”

面向过程,更加注重底层算法,因此语言的执行效率比较高,然而效率高的方式更偏向于计算机的思维,因此对编程者而言相对不那么友好,因此开发效率低。

面向对象,更加注重于上层的结构设计,对象和对象之间的关系构成,在执行效率上没有面向过程的要求高,思维更偏向于人的思维,因此对编程者比较友好。

例:把大象装进冰箱

面向过程

1. (我)先把打开

2. (我)把大象装进去

3. (我)再把门关上

面向对象

1. 大象把冰箱叫过来

2. 安排任务

3. 大象冰箱自己完成装配

C++是兼顾面向过程和面向对象,以面向对象为主的语言。

二、C++基础语法

头文件

C++内置头文件使用 <>且无.h   

若是非官方头文件,使用 ""且带.h

1、引用  reference

1.1基本使用

引用是简化的指针,相当于变量或常量的别名,操作引用与操作原变量相同。操作通常与栈内存对象结合使用

1.2 性质

(1)可以改变引用的值,但是不能再次成为其他变量的引用。

(2)声明引用时,必须初始化

(3)初始化的值不能为空
(NULL本身就是0,若真的想起别名,得用const int &b=NULL)
(4)声明引用时若初始化的值是纯数值,需使用const修饰引用,表示常量引用,此时数值 不可再变化
 

const修饰的常引用不能改变引用的但是引用原变量可以改变

(5)引用的指针:可以把引用地址交给指针保存此时指针指向还是引用原变量

       指针的引用:指针也可以有别名
【面试】引用与指针的区别

1.引用必须初始化,指针不必.

2.引用初始化后不能被改变,指针可以改变所指的变量.

3.不存在指向空值的引用,但是存在指向空值的指针.

例:实现两数交换

//使用指针
void swap1(int *a,int *b){

    int c;
    c=*a;
    *a=*b;
    *b=c;
}
//使用引用
void swap2(int &a,int &b){

    int c;
    c=a;
    a=b;
    b=c;
}

int main()
{
    int a=1;
    int b=2;
    swap1(&a,&b);
    swap2(a,b);

    return 0;
}
注意:使用引用传递参数可以提高效率,引用参数参数在可以被定义为const时(即不需要对参数本身进行操作,只需要使用参数的值的时候),尽量定义为const,以起到引用的安全性

2、初始化

// C语言初始化
int a=1;
int b=a;
// C++初始化
int c(1);
int d(c);
 // C++11初始化
int e{1};
int f{e};

{}初始化的方式也被称为通用统一初始化(一致性初始化),
这是C++11的新语法,多了一个窄化(精度丢失)警告功能

3、输入

使用cin

注意:在连续使用cin和getline时,要记得在cin结束后执行一下cin.ignore()来回收cin残留的换行符,否则getline无法正常执行

4、字符串类型 string

string本身不是C++基本数据类型因此使用前需要引入头文件 #include <string>

注意:#include <iostream>中包含的有#include <string>

string类型用于在大多数情况下代替char * ,不需要去担心内存是否够长等问题,且string内部集成了大量操作函数

(1) 取单个字符

(建议使用at()) 

    string str="hello";

    cout<<str[0]<<endl;//效率更高
    cout<<str.at(0)<<endl;//更安全
  

 发生越界等错误情况时:

 [ ]的运行结果未知

  

at()函数会直接报错并终止运行,因此at函数更安全

(2)求字符串长度
/* 以下二者相同
    str.size()
    str.length()
*/


cout<<str.size()<<endl;
cout<<str.length()<<endl;

(3) 遍历字符串 
     string str="hello";

    //1.for循环
    for(int i=0;i<str.size();i++)
    {
        cout<<str[i]<<" ";
    }
    //2.增强型for
    for(char i:str)
    {
        cout<<i<<" ";
    }
    //3.迭代器 

5、函数

5.1 内联函数 inline

C++中引入内联函数目的为了取代C语言中宏定义函数
内联函数关键字inline要放在函数定义的前面(不是函数声明),inline可以建议编译器进行主函数展开编译,如果生效,则可以提升程序的运行效率,因此消除了函数调用的额外开销。
一般把长度较小(5行以内)、频繁使用不包含复杂控制语句函数内联函数
后续学习的成员函数默认使用inline修饰但不一定是内联函数

 5.2 函数重载 overload

函数签名:函数名称、参数个数及其类型

如果在C++中“两个函数”的签名相同编译认为这是一个函数。如果函数名称相同但是参数个数或类型不同这样的函数构成了函数重载
注意:与函数返回值类型、是否被const修饰是无关的!!

除了上面普通函数可以重载以外后续学习的构造函数也能重载但是析构函数不能重载

 5.3 参数默认(缺省)值

C++允许函数参数设定默认值调用时如果传入参数使用传入参数如果不传入参数则使用默认值
  • 如果函数声明定义分离默认值可以写在声明定义但是只能出现一次
  • 如果函数某个参数被设置默认值右边(后面)所有参数必须设定默认值。(向右原则)
  • 尽量不要参数默认值函数重载一起使用因为新手很容易错乱
void print1(int a=1,int b=2,int c=3)
{
    cout<<a<<" "<<b<<" "<<c<<" "<<endl;

}
void print2(int a,int b,int c=3) //此时,在调用print2时,a、b必须传参,但c可传可不传
{
     cout<<a<<" "<<b<<" "<<c<<" "<<endl;
}

//void print3(int a,int b=2,int c) //错误!!向右原则!!
//{
//     cout<<a<<" "<<b<<" "<<c<<" "<<endl;
//}

int main()
{

   print1();
   print2(1,2);
//   print3(1,,3);

5.4 哑元函数

一个函数参数只有类型没有名字这个参数就是哑元这样函数就是哑元函数
例:

哑元函数特定场景发挥作用

● 可以使用这个参数强行重载函数

● 保持函数向前兼容特性(当写好的某个子函数经过迭代后,某个参数失效,他又在主函数中被调用了很多次,为了简化更新的工作量,可以将那个参数变为哑元)

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐