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);//出现二义性
}
原文地址:https://www.cnblogs.com/mango1997/p/14170000.html