上图动态制造对象,动态内存分配。C++用了两个关键字,new(制造一个对象)和delete(把那个对象收回),相当于C language 的 malloc 和 free
new做两件事 第一是分配空间,对于int来说这样足够了 第二是对于像Stash这样的类在分配完空间之后,还要做一件事情是调用它构造函数。
构造函数一定会被调用在这个函数被创建的时候,无论这个对象是本地变量还是堆里面的变量。堆空间里的对象。
new和delete是cpp运算符,任何运算符一定有结果,new的结果就是地址。
delete p所指的那个对象时,它的析构函数先被调用,然后空间才被收回。
new is the way to allocate memory as a program runs, Pointers become the only access to that memory
delete enables you to return memory to the memory pool when you are finished with it
可以用new的方式来申请数组,如上图new了10个int,
delete []psome 如果没有[],空间还是会被回收,但是析构只有第一个会被调用,[]告诉程序说psome所指的那个地方不是只有一个东西。delete 保证说psome所指的那么多个东西的那么多个析构都会被调用。
如上图,new int 的时候首先在堆空间里寻找一个空间,这个空间足够大,能够放下一个int , 然后p就指向了这个int, 与此同时有一张表记录下来你申请了这块内存。这个表记录两样东西,一个是这个内存地址在哪儿,另一个是这个内存大小,以字节为单位
申请了内存又没有释放它,就会造成内存泄漏。
访问限制
-
类里private(私有的)和public(公开的),它们用来说类里的哪些成员可以被别人访问,哪些成员只能被自己访问。
-
对于C++来说,所有访问成员可以是
-
public(任何人都可以访问),
-
private(只有这个类的成员函数可以访问这些成员变量或者成员函数)只在编译 的时候起作用,在运行的时候不起作用。
-
protected(只有这个类自己以及它的子子孙孙(子类以及子类的子类等等)可以访问)
-
三种访问属性之一**
private是对类来说的,不是对对象的,同一个类的对象之间是可以互相访问private成员变量的
C++的OOP特性只在源代码级别上存在。编译出来的东西就不是C++,后面生产出来的.o,不管是C,C++,汇编都是一模一样的。所以编译成二进制代码过后,已经完全丧失了C++的所有东西。
-
Friends,可以申明别的类,别的函数,别的类里面的某个函数是你的friends,它就可以访问你的private的东西了
class 与 struct
class defaults to private
struct defaults to public
即没有申明访问属性的地方,class默认私有,struct默认公开。
初始化列表(比构造函数还要早做)
在构造函数的原括号后面加上冒号,在冒号里面写上成员变量的名字,然后用括号来给出那个成员变量的初始值。
两种结果一样,不过第一种叫初始化第二种叫赋值。