• 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针


    一、函数原型声明:

    1、函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数);函数定义提供了函数的实际主体。

    2、强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前必须对所调用的函数作函数原型声明。

    3、在函数声明中,参数名称并不重要,只有参数类型是必须的。即下述两种写法都被允许:

    int max(int x,int y);
    int max(int,int);

    4、当函数定义 (func.cpp) 与代码主体 (main.cpp) 分开时,在 main.cpp 中添加 #include "func.cpp" 即可直接在代码主体文件中不作声明地调用函数。

    二、函数模板

    1、类型的参数化:①众所周知,数据的值可以通过函数参数传递,在函数定义时数据的值是未知的,只有等到函数调用时接收了实参才能确定其值。

       ②同样的,数据的类型也可通过参数传递。在函数定义时不指明具体的数据类型,当发生函数调用时,编译器根据传入的实参自动推断数据类型。

    2、所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)

    #include <iostream>
    using namespace std;
    
    //通用函数定义
    template<typename T1>
    T max(T a,T b,T c)
    {
        if (b>a) a=b;
        if (c>a) a=c;
        return a;
    }

    3、同样的,可以根据需要来确定类型参数的个数:

    template<typename T1, typename T2 >

    三、引用

    1、形参:如果函数要使用参数,则必须声明接收参数值的变量。这些参数成为函数的形式参数。形式参数就像其他在函数内声明的局部变量一样,进入函数时创建,退出函数时销毁。

    2、调用函数时,有两种向函数传递参数且运行后能传回给实参的方法:

    ①指针调用:把参数的地址复制给形参;②引用调用:把参数的引用复制给形参。

    *传值调用不会影响实参。它只是一种单向的传递,将实参值传给了形参。

    3、在C++中,变量的“引用”就是变量的别名,因此引用又称为别名 (alias) 。

      引用写法:    类型名 & 引用名 = 同类型的某变量名;

    int n=40;
    int& r = n;    //声明r是一个整形变量的引用变量,它被初始化为n
    cout << r;     //得到40

      # r 就是一个引用,也可以说r的类型是 int &

    4、对变量声明一个引用,并不另开辟内存单元,r 和 n 都代表同一变量单元。

    5、在声明一个引用时,必须同时使之初始化:通常用变量去初始化引用;也可以用引用去初始化引用;最后也可以用表达式的返回值为某变量的表达式去初始化引用,如下:

    1 //引用作为函数的返回值
    2 int n=9;
    3 int& SetValue() {return n;}
    4 int main()
    5 {
    6     SetValue() = 90;
    7     cout << n;    //输出90
    8     return 0;
    9 }

    这里解释一下第三行:SetValue() 函数的返回值类型是 int&,即返回值类型是个引用;而返回值是n,即 SetValue() 返回值是一个对 n 的引用。

    返回值为引用的优点是可以将其放置在等号的左边,具体作用将来碰到再讲。

    四、const常引用:用 const 对引用加以限定。

    int i=5;
    const int& a = i;    //声明常引用
    a = 3;        //尝试通过常引用 a 修改 i 的值,报错

    常引用不能通过引用去修改原变量的值,但原变量自己可以变化。

    五、const 常量指针

    1、定义常量指针:    const 类型名* 指针变量名;

    2、常量指针中,指针指向的内容不可改变。不可以通过常量指针修改其指向的内容,但可以修改指针的指向。

    int n,m;
    const int* p = &n;
    *p = 5;   //编译出错,不能修改指向的内容
    n = 4;    //ok,指向的内容自身可以变化
    p = &m;   //常量指针的指向可以变化

    4、常量指针不能赋值给非常量指针,反之可以(不推荐):

    1 const int* p1;
    2 int* p2;
    3 p1 = p2;    //ok
    4 p2 = p1;    //error
    5 p2 = (int* )p1;    //ok, 强制类型转换

    非常量指针(可改)获得了常量指针(不可改)的指向,就可以修改 const 指针指向的值,但大多数情况下 const 指针的指向值倾向于不被修改。

    5、常量指针能保护常变量的值:

    void MyPrintf(const char* p)
    {
        strcpy(p, "this");    //编译出错
        printf("%s", p);     //ok
    }

     strcpy()函数期待一个 char* 变量,而p在这里是一个const char* 变量,故编译错误。常量指针保护了 p 不被修改。

  • 相关阅读:
    多线程与多进程
    网络编程----socketserver多并发实现、FTP上传多并发、udp协议套接字多并发
    网络编程----粘包以及粘包问题的解决、FTP上传
    网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现
    python基础----软件目录结构规范
    python基础----模块、包
    python基础----异常处理
    python基础----常用模块
    python基础----再看property、描述符(__get__,__set__,__delete__)
    python基础---- __getattribute__----__str__,__repr__,__format__----__doc__----__module__和__class__
  • 原文地址:https://www.cnblogs.com/hsh17/p/11735972.html
Copyright © 2020-2023  润新知