• C++学习笔记二


    一、内存分区(不同区域存放的数据,与不同的生命周期)

    1)代码区:存放函数体的二进制代码,由操作系统进行管理

    存放CPU执行的机械指令,是共享的、只读的。

    2)全局区:存放全局变量、静态变量以及常量

     

    3)栈区:存放函数的参数值和局部变量

    4)堆区:有程序员分配和释放,若程序员不释放,程序结束时,由操作系统回收。

    二、new关键字

    1)利用new关键字可以将数据开辟到堆区,

    int* p = new int(10);//指针本质也是局部变量,放在栈区,指针保存的数据存放在堆区

            2)利用new在堆区开辟数组

            int* arr = new int[10];

    三、引用(给变量起别名)

    1)基本语法

    数据类型 &别名 = 变量名;

    int a = 10;
    int &b = a;

    注意:①引用必须初始化,如int &b;是错误的;

               ②引用一旦初始化后就不能更改了,再将b指向变量c就是错误的。

    2)引用做参数

    参数传递方法:①值传递;②地址传递;③引用传递

    引用传递和地址传递的效果一样。

    //引用传递
    void swap(int& a, int& b)
    {
        int k;
        k = a;
        a = b;
        b = k;
    }

    3)引用做函数的返回值

    ①不要返回局部变量的引用

    //调用两次的结果不一样
    int& test1()
    {
        int a = 10;
        return a;
    }

    ②函数的调用可以作为左值

    int& test1()
    {
        static int a = 10;
        return a;
    }
    int main()
    {
        int &ref = test1();
        cout << ref << endl;
        test1() = 100;
        cout << ref << endl;
        system("pause");
        return 0;
    }

    4)引用的本质就是指针常量,指针常量指针指向不能改,所以引用也不能改。

    int* const ref=&a;

    5)常量引用

    作用:常量引用主要用来修饰形参,防止误操作。在函数参数列表中,可以使用const来修饰形参,防止形参改变实参。

    void showvalue(const int &a)
    {
        cout << a << endl;
    }
    int main()
    {
        int a = 10;
        showvalue(a);
        system("pause");
        return 0;
    }

    四、函数默认参数

    1)

    int add1(int a, int b = 10, int c = 20)
    {
        return a + b + c;
    }
    int main()
    {
        int a = 10;
        cout<< add1(a);
        system("pause");
        return 0;
    }

    注意:若参数列表的某个参数有默认值,那么之后的参数都要有默认值,如int add1(int a, int b = 10, int c = 20,int d)是错误的。
    2)如果函数声明有默认参数,函数实现就不能有默认参数。

    int add1(int a, int b = 10, int c = 20);
    int main()
    {
        int a = 10;
        cout<< add1(a);
        system("pause");
        return 0;
    }
    int add1(int a, int b, int c)
    {
        return a + b + c;
    }

    五、函数的占位参数

    1)语法:函数返回值 函数名(数据类型){};

    void func(int a, int)
    {
        cout << a << endl;
    }
    int main()
    {
        func(10, 10);
        system("pause");
        return 0;
    }

    2)占位参数还可以有默认值

    void func(int a, int =10)
    {
        cout << a << endl;
    }
    int main()
    {
        func(10);
        system("pause");
        return 0;
    }

    六、函数重载

    作用:函数名可以相同,提高复用性。

    函数重载满足的条件:

    ①同一个作用域下;

    ②函数名相同;

    ③函数参数类型不同,或者顺序不同,或者个数不同。

    注意:函数的类型不能作为函数重载的条件。

    1)根据参数调用相应的函数

    void func1()
    {
        cout << 10 << endl;
    }
    void func1(int a)
    {
        cout << a << endl;
    }
    int main()
    {
        int a = 100;
        func1(a);
        system("pause");
        return 0;
    }

    2)函数重载的注意事项

    ①引用作为重载条件

    void func(int& a)
    {
        ...
    }
    void func(const int& a)
    {
        ...
    }
    int main
    {
        int a=10;
        func(a);//调用func(int& a)
        func(10);//调用func(const int& a)
        ...
    }

    ②函数重载碰到默认参数,会出现二义性

    例如:

    void func(int a)
    {
       ...
    }
    void func(int a,int b=10)
    {
        ...
    }
    int main
    {
        func(10);//出现二义性
    }
  • 相关阅读:
    桥梁模式
    OpenGL中的功能与OSG对应功能 (摘)
    STL源码学习----lower_bound和upper_bound算法[转]
    [转载]GMT地形数据总结
    关于OPenGL和OSG的矩阵 (转)
    GEOS库 介绍 (转)
    一个小巧的C++Log输出到文件类 (转)
    如何优化,让电脑真正快起来(转)
    数据库的应用——直接从内存中读取osg节点 (转)
    OSG 实现跟随节点的相机(转)
  • 原文地址:https://www.cnblogs.com/mango1997/p/14170000.html
Copyright © 2020-2023  润新知