c++之旅——第一弹

本篇文章内容为C语言到C++语言的过渡阶段第一篇,用来更好地过渡到c++阶段,所以没有讲和C语言相同的知识点,着重于两者之间的区别之处来进行讲述c++,创作不易,希望大家多多支持哦,如有知识性错误欢迎评论指正!

一.bool类型:
用来判断真假,判断条件、流程控制、逻辑运算

1.知识点介绍:
(1)、bool是一种数据类型
(2)、取值为true(真)或false(假)
(3)、定义: bool isDown=false;
(4)、内存大小占1字节
(5)、还可以赋值为一个数值,遵循非零即真,零即假的原则

二.内联函数:
1.知识点介绍:
(1)、内联函数是通过内存膨胀减少函数的跳转时间,以空间换时间。普通的函数调用都需要跳转到函数体,进行入栈出栈的过程,使用了内联函数相当于将函数体内容复制到调用处来减少跳转所花费的时间。
(2)、内存膨胀:代码区的行数或者代码量变多

2.内联函数的定义:定义一个内联函数也就是在定义函数的时候在返回值类型前面加上一个inline修饰函数

3.内联函数的特点:
(1)、还是一个函数,调用方式与普通函数是一样的
(2)、调用内联函数不会有入栈和出栈,不用跳转到函数中然后回到主函数
(3)、如果函数中执行的步骤很多,且是内联函数,还相当于一个普通函数,因为减少的跳转时间相对于函数体来说可以忽略不计了

4.(不)建议使用内联函数的情况:
(1)、函数体代码过长,或者函数体中有循环、递归,不建议使用内联  
(2)、函数体是简单的赋值语句或者返回语句,而且使用频率高,建议使用

5.内联函数和宏替换的不同之处:
内联函数在这里类似于带参宏替换,但是他们是有区别的,内联函数是一个函数,是在程序执行期间运行的,没有函数的入栈和出栈,带参宏替换是在预处理阶段执行的,本质是替换,内联函数有形参类型,有返回值类型和返回值,带参宏的形参是没有类型,没有返回值类型也没有返回值

三.引用:
1.知识点介绍:
引用是对一个变量或者对象取的别名, typedef  只能给类型取别名,这两者要区分开

2.引用的定义示例:

int a = 0;
int &b = a;
b=1;


在上述示例中,b 是对 a 的引用,它是 a 的别名。通过 b 可以操作 a,对 b 的修改也会影响到 a,所以此时a变量的值改变为了1.

3.引用的使用:(注意一点是引用不会占空间)
(1)、对结构体也可以使用引用:
示例:

struct node
 {   
 int x;    
 int y;
}
node n;
node &ref = n;
ref.x = 1;  //等价于n.x=1;


(2)、引用作为函数形参:
示例:

void fun1(int &x,int &y)    //形参为引用可以修改实参的值,作用效果相当于指针
{    x = 1;      
     y = 1;  
}
//注意:返回值为引用的时候,不要返回局部变量,如下,函数调用完之后a是会被释放的
int& fun2()
{    
     int a = 10;    
     return a;
}
int main()
{    
int value1 = 0, value2 = 0;    
fun(value1, value2);    
printf("%d,%d\n", value1, value2);  //输出为1,1        
int & ref =  fun2();    
printf("%d\n",ref); //输出10,第一次能输出是编译器的优化    
printf("%d\n",ref); //输出未知的值       
return 0;
}

4.引用的注意事项:
(1),由于引用是别名,所以定义引用的时候要对其进行初始化操作
(2),&(取地址,逻辑与的运算)在等号的左边是引用,右边是取地址,在两个式子中间是逻辑与
(3),引用不是定义新的变量或者对象,所以它不会开辟新的内存空间
(4),引用的类型必须要与所对应的变量类型相同

5.指针与引用的区别:
在效率上是没有多大区别的。  
1、引用是别名,不会被分配空间。指针是实体,会被分配空间  
2、引用在定义时必须初始化,而且不能被改变,指针定义时可以不用初始化,也可以改变值  
3、指针有多级指针,但是没有多级引用  
4、引用是直接访问,指针是间接访问

四,函数重载:
在同一作用域(同一项目)内,传递到函数中参数个数或类型不同就能实现重命名,即函数名字相同并且参数列表不同(1.参数个数不同   2.相对应位置上的参数类型不同)就是函数的重载。调用时使用对应参数类型的函数即可。

1.函数重载容易导致的二义性及其解决(简化代码实例):

int fun(int a){}
int fun(float a){}


从函数重载的重载条件来看,构成重载,编译不会有问题,但在调用时,如果调用方式如:fun(2.3); 这样由于函数的实参为double,而该函数并无该类型的重载,在编译时会自动将double类型强转去匹配函数,这时double可以强转为int,也可以强转为float,这样就会出现二义性的问题。

2.解决方式:
(1)、加入新的重载函数 int fun(double a){}
(2)、调用时对实参强转类型 如:fun((int)2.3);或者传一个不会进行转换的参数进去

五,函数的参数缺省:
1.概念:
在函数定义或者声明时给函数的参数提供一个默认值,然后在函数调用时,就可以不给这个形参传递实参而使用默认值了,如果给这个形参传递值了,那么就使用这个传递的值。

2.函数的缺省参数定义:

void fun(int a,int b=2){}
//函数调用: 
 fun(1); 
 fun(1,3);


 
3.函数的缺省参数注意事项:
(1)、缺省参数只能由后往前依次缺省,否则无法使用缺省函数的特性,比如有两个参数,缺省了第一个,但调用时要使用缺省函数的特性,就只能传一个参数,此时那么第二个参数就没有传值,会出现错误,而要解决这个问题,就需要将两个参数都赋值实参,但这样就又失去了参数缺省的意义,故只能从后往前缺省。
(2)、缺省值必须是常量,不能使用变量
(3)、函数如果只有定义,需在定义的参数列表中指明缺省参数。如果函数有声明和定义,则缺省参数只需在声明中指明即可。

4.函数的缺省参数与函数重载共同使用时产生的二义性及解决方法:
(1)二义性问题:

int add(int a,int b,int c = 0);
int add(int a,int b);
add(1,2);   //出现了二义性,此时不知道是调用了哪一个函数

(2)解决方式:
不使用该缺省函数或者不使用函数重载。

  • 27
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值