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);//出现二义性 }