嵌入式C++实战开发详解(一)

来源:互联网 发布:php cgi fastcgi 编辑:程序博客网 时间:2024/05/08 05:09

一、面向过程编程 VS面向对象编程

1、面向过程的特点:

a、c语言特点:

(1)c语言是在实践的过程中逐步完善起来的

  没有深思熟虑的设计过程,使用时存在很多“灰色地带”

(2)残留量很多低级语言的特征

  直接利用指针进行内存操作

c语言的目标是高效

b、面向过程程序设计:数据结构+算法

  问题:软件可重用性差;

       软件可维护性差;

       构建的软件无法满足用户需求。

2、面向对象的编程特点:继承、封装、多态性

3、C++支持的编程范式

过程式、数据抽象、基于对象、面向对象式、函数式、泛型形式、模板元形式。

二、C++相关基础知识点

1、C++之父是谁?

 本贾尼`斯特劳斯特卢普

2、C++语言的标准

C++98,C++03,C++11

三、从C到C++的升级

1、声明定义

C++中更强调语言的实用性,所有的变量都可以在需要使用时再定义。


 

使用register注意以下几点:

 

(1)、register只能修饰局部变量,不可修饰全局变量或函数;

 

原因:全局变量被多个进程访问,修饰为register只有当前进程知道保存于何处,其他进程无从知晓。

 

(2)、不能用&获取register变量地址

 

   原因:&获取的是内存地址,而register变量保存的是寄存器的地址;

 

(3)、register只修饰CPU所能接受的数据类型;

而在C++中可以取得register变量地址,对register关键字进行了优化。

3、const关键字

C语言中,const关键字的作用:

1、const修饰变量时,使该变量为只读变量,即const修饰的该变量,虽然空间可变,但是不能通过修饰的变量名修改空间。

 

2、用const修饰形参的作用:防止函数实现过程中修改实参的值,一旦被修改,立刻报错,便于调试。

C++编译器对const常量的处理

a、当碰见常量声明时在符号表中放入常量

b、编译过程中若发现使用常量则直接以符号表中的值替换

c、编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间

              

注:C++编译器虽然可能为const常量分配空间,但不会使用其存储空间中的值。

4、内存分配与释放

野指针指指向一个已删除的对象或未申请访问受限内存区域的指针。

C++中动态内存分配

C++中通过new关键字进行动态内存申请

C++中的动态内存申请是基于类型进行的

delete关键字用于内存释放

变量申请:

int *p = new int; delete p;

数组申请:

char *ptr = new char[100];delete [] ptr;

new关键字和malloc的区别:

(1)new是运算符,malloc是函数

(2)new 以具体类型为单位进行内存分配,malloc只能以自己为单位进行内存分配。

(3)new在申请单个类型变量时可以初始化,malloc不具备内存初始化的特性。

   如:int *p =new int(5);

      cout << “p = ”<<*p<<endl;

      delete p;

#include <stdio.h>

 

void func1(char *ptr)

{

   printf("ptr = %s",ptr);

}

 

void func2(char (*ptr)[100])

{

   int i;

         for(i= 0;i < 2; i++)

         {

             printf("func2 = %s\n",ptr[i]);

         }

}

 

void func3(char **ptr)

{

   int i;

         for(i= 0;i < 3; i++)

         {

             printf("func3:%s\n",ptr[i]);

         }

}

int main()

{

          char ptr[100] = "hello world";

 

          char str[100][100] ={"hello","world"};

 

          char *ktr[3] ={"hello1","hello2","hello3"};

 

          func1(ptr);

 

          func2(str);

 

          func3(ktr);

 

    return 0;

}

以上代码说明,一维数组名指针来接。二维数组名数组指针接。指针数组用指针的指针来接。

同理,用new申请空间时,

int (*pp)[2] = new int[2][2];

int (*ppp)[6][6] = new int [6][6][6];

 

5、引用VS指针

(1)引用

作用:引用是给一个变量起别名

一般格式:类型 &引用名 = 变量名;

例:int a =1;

int &b = a;

定义引用时一定要初始化,指明该引用变量为别名

例:int num = 5;

int &p =num;

p++;

cout <<num <<endl;

输出:6;

在实际应用中,引用常作形参和返回值

6.指针与引用区别

(1).引用访问一个变量是直接访问,指针是间接访问;

(2).引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间;

(3).引用一经初始化不能再引用其他变量,而指针可以;

(4).尽可能使用引用,不得已使用指针。

const引用

const int num = 5;

const int &p = num;

p++;

7、函数升级

(1)内联函数(inline)

内敛函数inline int max (int a,int b)

       {

           return a > b?a:b;

}

宏函数

#define MAX (a,b) (a) > (b) ? (a):(b)

宏函数与内嵌函数的比较:

宏函数执行效率高,不用分配内存,占用了替换时间,省去了为形参分配空间,典型的“以时间换空间”

内联函数省去调用和返回时间,增加内存空间,以空间换取时间。

 

一般将频繁调用的函数设为内敛函数。

(2)函数重载

定义:相同的作用域,如果两个函数名称相同,而参数不同,我们把它们称为重载

条件:形参数量不同,类型不同,顺序不同,返回值不能作为重载条件。

为了实现C与C++的混合编程,使用extern “C”


带默认形参值的函数

函数没有声明时,在函数定义中指定形参的默认值;

函数既有定义又有声明时,声明时指定后,定义后就不能再指定默认值;

默认值的定义必须遵守从右往左的顺序,如果某个形参没有默认值,则他的左侧参数不能没有默认值;

函数调用时,实参与形参按从左往右的顺序进行匹配。

7、命名空间

定义:namespace name

     {

     …..

}

命名空间的使用:

使用整个命名空间:using namespace name;

使用命名空间中的变量:using name::variable;

使用默认命名空间中的变量:::variable

默认情况下可直接使用默认命名空间中的所有标识符。



0 0
原创粉丝点击