高级语法
C++高级语法
根据 bilibili黑马程序员视频 网上资料 自己理解 整理的部分资料C++语法
一、面向对象编程
1. 内存分区模型
代码区:操作系统管理,存放函数二进制代码的区域。特点:共享、只读。
全局区:操作系统管理其生命周期,存放全局变量、静态变量和常量(包括const修饰的全局常量 和 字符串常量)。
栈区:编译器自行分配释放,存放函数的参数值(形参) 局部变量等。注意:不要返回局部变量的地址。
堆区:程序员分配释放,程序结束时操作系统回收堆区内存,关键字 new
注意:程序运行前划分为代码区和全局区,运行后分为栈区和堆区。
关键字 new
语法:new 数据类型
,释放利用关键字 delete
,语法:delete 数据类型
。
注意:new 创建的数据会返回该数据类型对应的指针
//定义在函数内部的变量一般是局部变量,在函数体外定义的变量属于全局变量
static int a = 10; // 静态变量
void* func(){
int* p = new int(10); //在堆区开区数据
return p; //指针本质上局部变量,存放在栈区,但指针保存的数据保存在堆区
int* arr = new int[10]; //定义一个大小是10的数组,保存的是首地址
delete [] arr; // 数组释放时,添加[]
}
int main(){
int* p = func();
cout << *p << endl; //输出结果为 10
delete p; //释放堆区中的 p
}
2. 引用
语法:数据类型 &别名 = 原名
,用于给变量起别名。注意:引用必须初始化,初始化后不允许改变了
用途1:引用传递,形参会影响实参,简化了指针修饰实参,通过引用参数产生的效果与地址传递的相同。
用途2:函数返回值,不能返回局部变量的引用,若函数变量作为左值出现,必须返回引用。
引用的本质在C++内部是一个指针常量,相当于int* cosnt b = &a;
,发现引用时自动转换成 解引用。
常量引用:用于修饰形参,防止误操作,即在函数中常量引用后不能修改形参的值。
int a = 10;
int c = 20;
int &b = a; //b为a的别名,相当于 int* cosnt b = &a;
int &b; //错误,b没初始化
b = c; //这不是更改为c的别名,而是幅值操作,即 a = 20 了现在
int test(){
static int a = 10;
return a;
}
int main(){
int &b = test(); //b作为a的别名,值为10
test() = 1000; // test函数返回的是静态变量a的本身,这句话相当于赋值语句,即a = 1000
cout << b << endl; // 输出b的值也是1000,因为b是a的引用
}
int &b = 10; //错误,引用必须引一块合法的内存空间
const int &b = 10; //正确,加入const后变为只读,这句话相当于int temp = 10; + const int &b = temp;
3. 函数
默认参数:返回值类型 函数名(形参 = 默认值){ },没有输入值就使用默认参数。注意:函数声明 与 函数实现 只能有一个默认参数。
占位参数:返回值类型 函数名(数据类型){ },占位参数可以有默认值。
函数重载:允许函数名相同,提高复用性。需要满足的条件:在同一个作用域下,函数名相同,但函数的参数类型、个数、顺序至少有一个不同。函数的返回值不能作为函数重载的条件,即仅有函数返回值不同,无法重载。
注意:引用作为重载条件 与 函数重载 碰到 默认参数 时会出错,出现二义性,应尽量避免这种现象。
int func(int a = 10, int b = 20, int c = 30); // 函数声明,添加默认参数
int func(int a, int b, int c){
// 函数实现
return a +