C++入门 ( 一 )

C++入门 ( 一 )

1. 缺省参数

1.1 定义

缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。

1.2 使用

1.2.1 全缺省

#include <iostream>
using namespace tsd;

void Func1(int a = 1) //单个形参
{
    cout << a << endl;
}

void Func2(int a = 1, int b = 2, int c = 3)//多个传参
{
    cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}

int main()
{
    Func1();   //不进行传参, 此时a为缺省值 1
    Func(10);  //进行传参,此时 a 为传过去的参数 10 , 而不使用缺省值
    
    Func2(10,20,30);
    Func2(10,20);
    Func2(10);
    Func2();
    
    // 必须按顺序传参, 不能跳跃传参
    //Func2(10, , 30); //该语句会报错
    
    return 0;
}

1.2.2 半缺省

只能从右往左缺省 ( 这样不会存在歧义 )

#include <iostream>
using namespace std;

void Func(int a, int b = 20, int c = 30)
{
	cout << a << endl;
    cout << b << endl;
    cout << c << endl;
}

int main()
{
    //Func();     //此时未给a缺省值, 必须要给它传一个参数, 不然就会报错
    Func(1);
    Func(1,2);
    Func(1,2,3);
    return 0;
}

2. 函数重载

C语言中不允许重名函数的存在, 而C++中却支持, 究竟是因为什么呢, 让我们来一探究竟吧!

2.1 函数重载概念

函数重载 : ** 在同一作用域下声明几个功能类似的同名函数**, 这几个同名函数参数的形参列表(参数个数 或 类型 或 类型顺序)不同, 常用来处理功能类似的应用

#include <iostream>
using namespace std;

// 1、参数类型不同
int Add(int left, int right)
{
    cout << "int Add(int left, int right)" << endl;
    return left + right;
}
double Add(double left, double right)
{
    cout << "double Add(double left, double right)" << endl;
    return left + right;
}

// 2、参数个数不同
void f()
{
	cout << "f()" << endl;
}

void f(int a)
{
	cout << "f(int a)" << endl;
}

// 3、参数类型顺序不同
void f(int a, char b)
{
	cout << "f(int a,char b)" << endl;
}

void f(char b, int a)
{
	cout << "f(char b, int a)" << endl;
}

int main()
{
    
    Add(10, 20);
    Add(10.1, 20.2);
    
    f();
    f(10);
    f(10, 'a');
    f('a', 10);  
    
    //调用时不能有歧义, 不然会报错~
    //只要满足就构成重载, 但是构成重载也有可能调用歧义
    
    //返回值不同无法区分, 因此返回值不是重载的条件!
    
    return 0;
}

2.2 为什么C语言不支持重载, C++支持重载

在链接时 :

C语言直接用函数名去寻找函数, 而**C++是用修饰后的函数名(带上函数的参数)**去寻找, 故而支持重载

3. 引用

3.1 引用的概念

引用就是取别名

#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    
	int& b = a;
	int& c = a;// 可以给一个变量取多个别名
	int& d = b;// 可以给别名取别名
    
    d++;// 此时 a,b,c,d 均 +1, 本质指向同一片空间, 地址相同
    
    return 0;
}

3.2 引用的特性

  1. 引用在定义时必须初始化

  2. 一个变量可以有多个引用

  3. 引用一旦引用一个实体, 再不能引用其他实体

    void TestRef()
    {
       int a = 10;
       int b = 20;
       // int& ra;   // 该条语句编译时会出错
       int& ra = a;
       int& rra = a;
       // ra = b;   // 该条语句也会出错
       printf("%p %p %p\n", &a, &ra, &rra);  
    }
    

3.3 常引用

注意权限是否被 放大 / 缩小

可以缩小, 但是不可以放大!

void TestConstRef()
{
   const int a = 10; 
   //int& ra = a;   // 该语句编译时会出错,a为常量
   const int& ra = a;
   // int& b = 10; // 该语句编译时会出错,b为常量
   const int& b = 10;
   double d = 12.34;
   //int& rd = d; // 该语句编译时会出错,类型不同
   const int& rd = d;
}

3.3 引用和指针的区别

语法概念上引用就是一个别名,没有独立空间,和其引用实体共用同一块空间。

int main()
{
   int a = 10;
   int& ra = a;
   cout<<"&a = "<<&a<<endl;
   cout<<"&ra = "<<&ra<<endl;
   return 0;
}

底层实现上实际是有空间的,因为引用是按照指针方式来实现的。

int main()
{
   int a = 10;
   int& ra = a;
   ra = 20;
   int* pa = &a;
   *pa = 20;
   return 0;
}

引用和指针的不同点:

  1. 引用概念上定义一个变量的别名,指针存储一个变量地址。

  2. 引用在定义时必须初始化,指针没有要求

  3. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体

  4. 没有NULL引用,但有NULL指针

  5. 在sizeof中含义不同**:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数**(32位平台下占4个字节)

  6. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小

  7. 有多级指针,但是没有多级引用

  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理

  9. 引用比指针使用起来相对更安全

今天的分享就到这啦, 博主也是第一次写博客, 有什么不足欢迎大家在评论区指正吖 !
希望可以与大家一同进步, 加油 !

  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值