c语言到c++过渡2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dxd_123456/article/details/78006460

本文接上文所讲,对c语言到c++间的过渡做一个归纳

1、函数参数问题
首先是函数的参数问题,c语言中函数可以没有返回参数类型,函数参数可以没有数据类型,没有参数的函数可以接收任意个参数,这样是不太好的,而在c++中,没有参数的函数就被看做是无参函数,不能给函数传参,而且在c++中函数参数必须要有类型。

2、新增bool类型关键字
C++在C语言的基本类型系统之上增加了bool,C++中的bool可取的值只有true和false,理论上bool只占用一个字节, 如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器的实现。true代表真值,编译器内部用1来表示,false代表非真值,编译器内部用0来表示。bool类型只有true(非0)和false(0)两个值, C++编译器会在赋值时将非0值转换为true,0值转换为false
案例:

bool b = false;
int a = 0;
b = a - 1;// b此时变成了数值上的-1,而bool值为1
b++;

printf ("%d\n", b);
//此时b的值输出为1,所以bool型数据只要非0即为1;

3、三目运算符的增强
C语言返回变量的值, C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用,C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。
三目运算符如果要作为左值,返回的表达式中必须要没有常量。

其实C语言也可以和c++完成同样的操作,其实c++就是进行了这样一部的操作:
*(a > b ? &a : &10) = 100;这样就也能作为左值赋值了。

4、const关键字的比较
C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间。
C++中 const 变量声明的是一个真正的常量,不是变量,所以编译器不会为该常量分配空间,const 修饰的常量会被放到 符号表 中,当编译器检测到要const常量进行取地址操作,它会为 a 分配内存,但是这个内存并不会被 a 使用,const 常量 a 并不会使用分配它的空间,使用 a 的时候,用常量表中的值进行替换

建议用 const 常量 代替宏常量 , define 宏 在预编译的时候进行处理 const 是在编译的时候进行处理的,宏做简单替换,不会进行类型检查,作用域的检查。

5、引用
引用可以看作一个已定义变量的别名
定义一个引用变量,b 是 a 的引用
定义变量a, a是一个整形变量,占4个字节
a变量代表这4个字节的内存,a就是这块内存的名字
int a = 10;
a 是一块4字节内存的名字,引用的意思是给这块内存重新取个名字
b a代表的那块内存的别名,b 和 a 代表同一块内存
引用的语法:在定义变量的时候在变量前 加 &
int &b = a;

普通引用在声明时必须用其它的变量进行初始化
意义:
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性

指针引用

void init1(A * &p)
{
    p = (A *)malloc(sizeof(A)/sizeof(char));
    p->id = 20;
}

int main()
{
    A *pa = NULL;
    init1(pa);
    printf ("id = %d\n", pa->id);

    return 0;
}
//指针引用一定程度上可以减少二级指针的使用。

引用的本质是指针,常指针

int &b = a; <=> int * const b = &a;
这两者是等价的。
如果函数返回值是引用,不能返回栈上的引用,可以返回静态变量和全局变量的引用
函数返回值是引用,如果用引用去接,接回来的是一个 引用
函数返回值是引用,可以用普通变量去接,接回来的是一个 值
函数返回值是引用,可以作为左值来使用。

常引用
常引用,意思不能通过引用改变被引用的值
常引用的初始化有2中方式
1)引用普通变量,不能改变变量的值
2)使用常量去初始化常引用
当使用常量对常引用进行初始化的时候,编译器会为这个常量分配一块空间
将这个常量的值复制到这个空间里
然后让这个常引用作为这个空间的别名

6、内联函数
在普通函数前加 关键字 inline 将函数变成内联函数,inline 必须要和函数定义放一起,如果和函数声明放一起会被忽略,inline是向请求在调用该函数的时候进行函数体的替换,编译器可能拒绝内联请求, 如果内联成功,编译完以后代码是没有这一段函数的,内联函数函数体不能过长,最好不要超过 5 行,不能有循环语句,复杂的 if 语句,不能对内联函数进行取地址操作。

7、默认参数
C++中可以在函数声明时为参数提供一个默认值,
当函数调用时没有指定这个参数的值,编译器会自动用默认值代替
如果给函数一个参数赋了一个默认的值,那么这个参数后面的所有参数都必须要有默认值
如果一个函数的参数只有类型,没有变量名,把这个参数叫做占位参数,函数的占位参数可以和默认参数一起使用

8、函数重载

用同一个函数名定义不同的函数被称为函数重载
当函数名和不同的参数搭配时函数的含义不同 ,根据调用的时候传的参数类型,决定调用哪一个函数

函数重载至少满足下面的一个条件:
1)参数个数不同
2)参数类型不同
3)参数顺序不同

调用函数重载的准则:
将所有同名函数作为候选者
尝试寻找可行的候选函数:
1 )精确匹配实参
2) 通过默认参数能够匹配实参
3) 通过默认类型转换匹配实参
匹配失败:
1) 最终寻找到的可行候选函数不唯一,则出现二义性,编译失败。
2) 无法匹配所有候选者,函数未定义,编译失败。

注意事项:
重载函数在本质上是相互独立的不同函数(静态链编)
重载函数的函数类型是不同的
函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的。

函数重载与函数指针:
当使用重载函数名对函数指针进行赋值时:
根据重载规则挑选与函数指针参数列表一致的候选者
严格匹配候选者的函数类型与函数指针的函数类型

猜你喜欢

转载自blog.csdn.net/dxd_123456/article/details/78006460