您的位置:首页 > 编程语言 > C语言/C++

C到C++的过渡

2017-09-18 14:24 127 查看
为了强化我们的C语言编程能力,提高编程的代码质量,更是由于嵌入式软件工程师岗位的需求,我们即将开始C++语言的学习。当然,学习C++语言也为我们以后接触一些其他编程语言提供了良好的基础。

我们一直说的C++与C的最大区别就在于,C++是面向对象的,即C语言+面向对象方法论就成了我们的C++。而什么是面向对象呢,通俗的说就是将现实世界中的事物直接映射到程序中,可直接满足用户需求。这样,它的优势就在于它构建的软件能够适应用户需求的不断变化,以及直接利用面向过程方法的优势而避开其劣势。当然,现代软件系统一般都是用多种语言编写而成,C++也是其中不可或缺的一部分,也是学号其他语言相当重要的一个途径。

接下来,就是一些C++对C语言一些方面的加强:

   1)命名空间:为了解决合作开发时的命名冲突问题,C++引入了命名空间的概念。利用namespace 关键字可以定义一个命名空间,其中可以包含很多类型,也可以嵌套使用。使用时,主要有以下3种方法:(1):域解析符“ ::”。如:NameA::a = 2;
  (2):using 关键字,有效范围为当前{}。如:using namespace NameA;
  (3):对命名空间中单个元素多次使用时。如:using NameA ::swap;

此外,直接使用“::”符号就是指全局变量   

   2)
int a;
double b;
cin >> a >> b;
cout << "a = " << a << " ,b = " << b << endl;


   cin与cout支持输入输出所有基本类型数据,在iostream中定义;

   << 与 >> , 在这边被重载,指数据的流向,支持连续操作;

   endl 表示换行,等同于"\n";

   3)C++语言增强了语言的“实用性”,所有变量不需要在作用域开始时定义,而是在需要使用时定义;

   4)对于寄存器变量,C语言中无法取到register变量的地址,而C++则支持,但会将register对变量的声明变得无效。

   5)在C++中不允许全局变量的重复定义。

   6)C++中认为结构体是新的变量类型,可以直接用来定义变量。如:
Student std = {19, "zhang"};

      此外,C++结构体中可以存放函数,但函数不参加结构体大小的计算。

   7)c++中的所有变量和函数都必须要有类型说明,c中的int()返回值为整型,参数任意,但c++中int()与int(void)都表示无参函数,

   8)新增bool类型, bool类型只有true(非0)和false(0)两个值。

   9)三目运算符的加强,C++中三目运算符返回的是变量本身,可以作为左值使用。

   10)const关键字,C中它修饰的只是一个常变量,本质还是变量,有自己的地址空间。但C++中则直接修饰为常量,存放在长量表中。但这边的const修饰与宏定义又有所区别,宏定义是预编译期间直接替换,没有类型与作用域检查,但const会有。

   11)接下来的这个是比较重要的拓展:引用

int a = 10;   int &b = a;
这边的b就是a的一个引用,其本质可以看成是这样一个常指针(它也占用4个字节的空间):
int * const b = &a;
它就是为内存a重新取了一个名字叫做b,通常在C++中用引用来代替指针。

当函数返回值是引用时需要注意的点:

1、不能返回栈上的引用,同指针一样,只能返回静态变量和全局变量的引用。

2、如果用引用去接,接回来的自然是一个引用;但要是用普通变量去接,接回来的就是一个值。

3、可以作为左值来使用。

常引用: const int & b = c

不能通过引用来改变被引用的值。

它的初始化有2种方式:

1、引用普通变量,不能改变变量的值:int a = 100;    const int & b = a;

2、使用常量初始化常引用:const int & a = 10;

当使用这种初始化方式时,编译器会为这个常量分配一个空间,将这个常量的值复制到这块空间中,然后让这个常引用作为这块空间的别名,即生成了一个只读变量。

   12)内联函数

C++中添加了内联函数来替代宏函数,只需要在普通函数前加上关键字inline就构成了一个内联函数。inline关键字必须和函数定义放在一起,如果是和函数声明放在一起的话,会被忽略。与宏函数被预编译器处理不同,inline是由编译器处理的,它会有函数参数检测,返回值检测,作用域检测。inline是在请求调用时进行函数替换(但编译器可能会拒绝),一旦内联成功,代码就没有这一段函数。

内联函数体不能过长(最好不超过5行),不能有循环语句,不能有复杂的if语句,不能对内联函数进行取址操作。

   13)默认参数与占位参数

首先来看默认参数,当函数调用时没有提供该参数的值时会使用默认参数,在有默认值的参数后面的参数必须得有默认参数;

int mul (int a, int b = 5, int c = 10){}

占位参数是指函数的参数只有类型没有变量名:
int add (int a, int b, int) {}
为了以后的程序扩展留下线索,C++引入了占位参数,其实它的存在类似我们之前学习过的无名位域:
struct A
{
unsigned int a:10;
unsigned int b:10;
unsigned int  :10;
unsigned int c: 2;
};


今天遇到一个问题,回来修改一下这里:

在声明和定义函数时,只需要一处写默认参数,不然会出现编译编译时会报重定义的问题(写在声明中比较直观,也方便修改)

   14)函数重载:函数名相同,但参数不同,根据调用时传的参数类型或数量不同决定调用哪个函数;

下面是一些注意点:

函数的返回值不能作为函数重载的判断条件;

普通变量参数:int a 与const int a 不能重载  ; 引用参数:int &a 与const int &a 能重载

函数重载与函数默认参数同时使用会导致二义性;

当一个重载函数赋给一个函数指针时,需要严格匹配指针类型,并且根据重载规则挑选与函数指针参数列表一致的候选者。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: