友元
分为友元函数和友元类
1.友元函数
友元函数是声明!!!
声明在类中public或者satical都可以
friend void operator<<(ostream& out,
const Data& d1)
ostream不可以加上const
把这个声明在自定义类型中
定义在全局
不可以定义在类里面
友元函数可以访问类的私有和保护成员,但不是类的成员函数
友元函数不能用const修饰
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数
友元函数的调用与普通函数调用原理相同
2.友元类
和函数一样
友元关系是单向的,不具有交换性
友元关系不能传递
a是b的友元,b是c的友元,不能说a是c的友元
class Time
{
friend class Date; 说明日期类是时间类的友元类,则在日期类中就直接访问Time类中的私有成员变量
private:
int _hour
int _minute
int _second
}
class date
{
}
动态内存
平时写的代码存在磁盘上
会以进程的形式在操作系统上运行
会对数据的存储区域进行划分,划分的区域整体叫做
虚拟进程地址空间
栈 栈帧 存储局部数据
堆 存储动态申请数据
静态区 静态数据和全局数据
/数据段
常量区 常量数据
/代码段
1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。
3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段--存储全局数据和静态数据。
5. 代码段--可执行的代码/只读常量
C++
1.new
c
int* p1=(int)malloc(sizeof(int))
free(p1)
c++
int* p2=new int
delete p2
如果要10个
int* p3 = new int[10]
delete[ ] p3
也可以初始化
int* p4=new int(10)
delete p4
注意跟p3区分
10个数组初始化
int* p5=new int[10]{1,2,3}
想初始化几个初始化几个,后面不够初始化成0
delete[ ] p5
优点:malloc是纯粹的开空间
new可以做到动态申请出来就初始化了
对于自定义类型会调用构造函数初始化