c++学习(二)
内存分区
运行前是代码区和全局区,运行后是分为栈区和堆区
代码区:共享和只读。存放函数体的二进制代码, 由操作系统进行管理的
全局区:存放全局变量和静态变量以及常量,由操作系统管理释放 常量又分为const修饰的常量和字符串常量。const修饰局部变量在非全局区中
栈区:由编译器自动分配释放,存放函数的参数值,局部变量等。不要返回局部变量地址。
栈中的数据的地址只能拿到一次,拿不到第二次。不要返回局部变量地址
堆区:由程序员分配和释放,程序员不释放,程序结束时由操作系统回收。用new来开辟内存
利用new 关键字 可以将数据开辟到堆区
指针本质也是局部变量 放在栈上 指针保存的数据是放在堆区
p 在栈区,但 p 指向的是堆区。返回堆区地址。堆区不会随函数结束而释放
在堆区的数据要手动管理释放
int* func1() {
//在堆区创建整型数据
//new返回是 该数据类型的指针
int* p = new int(10);
return p;
}
int* func() {
int * p = new int(10);//返回保存10的这块内存的首地址
return p;
}
void test() {
int* p = func();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
//堆区数据 程序员管理释放
//delete
delete p;
cout << *p << endl;
}
给变量起别名
数据类型 &别名=原名
C++ 语法规定:引用一旦初始化,使用它时永远不需要加 *,也不需要加 &,直接把它当成原来的变量用就行。引用必须初始化
int a = 10;
int& b = a;
cout << a << endl;
cout << b << endl;
b = 100;
cout << a << endl;
cout << b << endl;
int c = 20;
b = c;//这只是赋值20,但abc的值就都为20了 引用之后,ab就是同一块内存了。
swap(a, b);
cout << a << endl;
cout << b << endl;
常量引用
用来修饰形参 防止误操作
const int& ref = 10
引用必须引一块合法的内存空间,这个形参就改不了
void showValue(const int&val)
函数默认参数
传了就用传了的,没有就用默认。形参的默认值从前到后都得有
如果函数声明有默认参数,函数实现就不能有默认参数,声明和实现只能有一个默认参数
a=12,b=6,c=20
int sum(int a ,int b=100,int c=20)
func3(12, 6);
函数占位参数
占位还可以有默认参数 只有类型声明、没有变量名的函数形参。
void func3(int a,int) {
cout <<"this is func" << endl;
}
重载函数中的引用
int &和const int& 是不同的
fun4(变量)调用的是上面的函数 fun4(10)调用的就是下面的。变量和常量的区别
void func4(int& a) {
}
void func4(const int& a) {
}
函数重载碰到默认参数
func5(10)出现歧义了,要避免,重载就不要写默认参数了
void func5(int a) {
}
void func5(int a,int b = 10) {
}
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)