结构体:
初始化方式不同于类,不需要构造函数
#include<iostream>
#include<string>
using namespace std;
struct student {
string name;
int id;
};
int main() {
student zzx = { "zzx",213 };
}
不知道有什么好解释的,也就全员public吧。
通讯录管理系统:
注意一下最好保证内存中的数据清空比较好,没了
程序的内存模型:
1.C++运行时,内存大方向被分为4个区域
代码区(函数体的二进制代码)、全局区(全局变量、静态变量、全局常量)、栈区(编译器分配和释放)、堆区(程序员分配和释放)
2.程序运行前,已分为代码区和全局区,代码区共享(方便多次调用)且只读(无法篡改),全局区不包括局部常量、局部变量,栈区包括了局部非静态变量
3.栈由编译器管理,不会产生内存碎片,而堆由程序员自己管理,会产生内存碎片
栈:使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;从高地址到低地址
堆:存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些;从低地址到高地址
引用:
相当于给变量取别名,本质是指针常量,编译时会自动解引用,所以用法和指针规则不同
常量必须有初始值->引用必须初始化->不需要判断引用是否存在
编译器会为栈区的局部变量做一次保留
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int* func1();
int* func2();
int& func3();
int& func4();
int* p = func1();
cout << "*p=" << *p << endl;
cout << "*p=" << *p << endl;
cout << "func1=" << (int)&func1 << endl;
*func1() = 20;
cout << "*p=" << *p << endl;
cout << "func2=" << (int)&func2 << endl;
*func2() = 30;
cout << "*p=" << *p << endl;
cout << "func3=" << (int)&func3 << endl;
int& p2 = func3();
cout << "p2=" << p2 << endl;
cout << "func4=" << (int)&func4 << endl;
func4();
cout << "p2=" << p2 << endl;
system("pause");
}
int* func1() {
int a = 10;
cout << "&a=" << (int)&a << endl;
int* p = &a;
return p;
}
int* func2() {
int b = 15;
cout << "&b=" << (int)&b << endl;
int* p = &b;
return p;
}
int& func3() {
int c = 20;
cout << "&c=" << (int)&c << endl;
return c;
}
int& func4() {
int d = 25;
cout << "&d=" << (int)&d << endl;
return d;
}
/*
输出
&a=19920584
*p=10
*p=2069207432
func1=4067488
&a=19920584
*p=20
func2=4067908
&b=19920584
*p=30
func3=4068108
&c=19920584
p2=20
func4=4068213
&d=19920584
p2=25
*/
由此可看出栈对局部变量只做一次保留,否则对象必须存储在全局区,又因为程序结构过于简单,编译器每次都把函数内唯一的局部变量分配到栈区内相同的地址,即使并不是相同的函数。
常量引用类似于常量指针(指针-5)