C++函数模板,引用变量----C++基础(第三期)

本文介绍了C++中的关键概念,如函数返回值类型限制、指针和数组的使用、内联函数与引用的作用、函数模板的显式具体化、C++11的新特性如decltype和auto,以及内存管理、命名空间和函数指针等内容。
摘要由CSDN通过智能技术生成

C++基础知识

函数:
  • C++中对函数返回值有一定限制:不能是数组,但可以是其他任何类型------整数,浮点数,指针,结构体,对象(可以将数组作为结构体或对象的组成部分返回)。
int *ar,  arr[ ];   //*ar指向数组arr,则arr[i]==*(ar+i)

//此时  sizeof  ar;为指针变量的字节长度,
//sizeof  arr; 为整个  数组的字节长度。
  • 可以在函数声明和定义时这样做:

数据类型 函数名(const 数据类型 参数)

该函数中的参数形式 表明参数成了常量,即在该函数体内参数不可 修改。

  • 使用数组区间的函数: (C++)

    有一种方法是在函数中通过传递两个指针来表示整个数组的传入。一 个指针指向数组的首地址,另一个指针指向数组最后一个元素的后一个位置。

  • 常量地址和地址常量:

const  int *p;  //此时*p指向的是const int类型,
               //即一个常量。(常量地址)

int* const p;  //此时p上存的地址是一个常量,不可修改。(地址常量)
  • 关于cin:

    int t=10; cin>>t; 当输入不是整数时,cin会将值留在缓冲区并返回一个即将被转化为false 的值,且在缓冲区中,cin 会留下一个错误标志,此时需要cin.clear()来清理错误标志。

  • 函数指针:

返回值 函数名 (参数列表); //函数名中存储着整个函数的地址。

例子:

//函数指针:
void tink(double ,int);
void (*pf)(double ,int)  =tink    //函数指针pf
//可以像上面这样直接赋值,也可以单独赋值 pf=tink;

//要求:函数指针和函数的返回值,参数顺序,类型必须完全相同。


//函数指针数组:
void(*pf[3])(double,int)={tink1,tink2,tink3};
//tink1,tink2,tink3均为函数名
  • 内联函数:

    常规函数:程序运行至函数调用处时,编译器会记录该处的地址,并跳入函数所在的另一个存储空间执行代码,执行完毕后,编译器会通过之前记录的地址回到主函数,继续执行主函数中剩下的代码。

    内联函数: 调用函数时,不再需要跳到其他空间,因为函数在与主函数在同一存储空间(节省了调用函数的时间,但却牺牲了存储)

    用法:将函数的整个定义放在主函数中该函数的原型(即声明)处(替换);并在函数定义前加上关键字inline。

    当函数频繁被调用时,可以将函数转化为内联函数。

引用变量:
  • 引用是已定义的变量的别名,几个变量都可以使用,它们代表的是同一个地址上的数据。(一般用作函数的形参)

  • int a=10; int &b=a; 此时叫b对a的引用,即b为a的别名。

    &不再是取地址符,而是类型标识符的一部分。

  • 引用必须在创建时进行初始化,且一旦与某个变量关联,就将一直忠于它。其更接近于const 指针即 int * const p;----地址常量。

    引用变量作形参: int add(int &a) {……}

  • C++中,引用参数尽可能地使用const :

  1. 使用const可以避免无意中修改数据造成的错误。

  2. 使用const可以使函数既可以接受const实参,也可以接受非const实参。

  3. 使用const引用可以使函数能正确生成临时变量(编译器自己生成一个符合形参的变量(临时),其值与传入的实参数值上相等,且这种临时变量只在函数调用时存在,此后便会被删除)。

  • 一个父类的引用可以指向它自己的子类对象。传递类对象参数标准方式就是按引用传递。
函数模板:
template <typename T>
void Sdd(T a)
{……}   

其中typename 关键字可以替换为class;T只是一个泛型,它可以是任何具体的类型(在同一个函数中T只能表示一种类型)。

  • 显式具体化:模板重载-----即当形参个数一致时,在这种情况下,模板重载无法提供其他不同代码,此时就需要用到显式具体化。

    写法:在函数原型(声明)和定义处以template<>打头。

    写法1. template<> void swap(int &a ,int &b)

    写法2. template<> void swap<int>(int &a,int &b)

    优先级:非模板函数>显式具体化>模板函数-----编译器按照此优先级顺序查找,找到与函数调用匹配的定义时,将使用该定义,不再继续向下找。

C++11: 新增关键字decltype
int x; double y;
decltype(x)y; 
//将变量y类型转换为变量x的类型。

x可以是一个函数,此时y就是函数返回类型。 decltype 本质是一个类型。

C++ 11后置返回值:

C++可以有这样一种声明: auto 函数名(参数列表)->返回值类型(如int) 这里的auto是一种新玩法。

静态变量:

C++ 有三种静态变量:

1.外部链接(可在其他文件中访问)。

2.内部链接(只能在当前文件中访问)。

3.无链接性(只能在当前函数或代码块中访问)。

1的定义方式:在代码块外声明变量(main函数外)

2的定义方式:在代码块外声明变量,并在前面加上static。

3的定义方式:在代码块内声明变量,并在前面加上static。

C++中使用全局const定义相当于使用了static全局定义一样。

例子:const int a=10; <------> static const int a=10;

定位new运算符

new关键字的重载需要引入头文件#include<new>。使用new可以让用户指定要使用的位置。用法:

int value[500],*p1; *p1=new(value)char[20];

从value中分配空间给一个包含20个元素的char数组。(此空间在栈上)

自定义名称空间:
    namespace Jack{

    double pail;

    void fun(){……}

    struct PPT{……}
    }

using jack::fun;------这个叫using声明

using namespace jack;-----这个叫using 编译指令。

使用using声明后,不能再在代码块中定义同名变量(此时using声明在代码块里),而使用using编译指令,则可以定义同名变量,且两个同名变量会相互覆盖。

若已经有个同名的全局变量pail;则名称空间中的pail会覆盖全局变量pail(using 声明或编辑指令在代码块中);

若要使用全局的pail,写法: ::pail

名称空间的嵌套
namespace myth{

using jack::fun;    

namespace file{int a; ……}
}

使用file空间: myth::file;

空间别名:namespace mv=myth;

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

freejackman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值