1、对象的创建:有七种A a(3),b=3,c=A(3),d(a),e=a,*f=new A(3),*h=new A(a),a={3};
2、指针与引用
一:指针,对象使用指针:用->进行操作;作为函数的参数;作为类的数据或成员。
二:引用,传送大对象要比按值传送更快,避免了复制过程,拷贝构造函数就是利用这点。
3、前向声明:当类A中使用了类B,类B中又使用了类A,那么总有一个要使用未声明的,于是将未声明用class A;的放在前面称前向声明。
4、const成员函数,使用时不能改变数据成员值,同时调用也只能调用const的成员函数。
5、嵌套类:类A中包含了类B的声明及定义,称为嵌套类。 主要目的是限制类B在外部使用。
与类的组合是有区别的,这时并没限制各自的使用。
嵌套类在定义时,需要两个限定,例: int A::B::show();一般内部类B的成员都声明为公有。
6、拷贝构造函数:函数若无拷贝构造函数,编译器会提供默认拷贝构造函数。默认的拷贝构造函数会把原对象的数据成员的值复制到新建对象的对应数据成员中。
定义: Type::Type(const Type& object){...}
只能是引用,如果不是引用,当调用它时,会复制参数,这个过程就是拷贝复制函数过程,这样就会无限循环下去,无解!!!
用const来说明,它只是创建新的副本,不会修改原对象。
如何禁止拷贝复制函数?
把拷贝构造函数声明为类的私有成员,可阻止类外使用它,并且阻止编译器生成默认的拷贝复制函数。当然类内部是可以用的:)
7、析构函数的前夜:
动态创建的成员在自由存储区。代码分区了内存,就应负责释放。总应在对象地址消失前,手动释放对象在自由存储区中的内存。否则会越建越大,导致程序失败。
注意:程序执行完毕后,尽管我们没有手动释放动态内存,但操作系统总是会重新分配内存。我们只是考虑程序退出前的状况。
上面只是针对析构函数而言,对于New一个对象,它的过程与上面不一样:
new先分配内存空间,并调用构造函数创建该对象。这里,不是构造函数来分配的内在空间,而是调用构造函数的代码分配内存空间。不用时直接delete删除。
8、析构函数:同拷贝构造函数一样,编译器总会提供一个默认的析构函数,其实它什么代码也没有,什么也没有做。而且默认的析构函数不会释放在类对象中分配的自由存储区的内存,因为这是你创建的,你就得去释放,正所谓谁拉屎谁擦屁股。
定义: Type::~Type( ) {.....}; //注意:析构函数是没有返回类型和参数的,若指定它们会出错。
默认的析构函数没有显式的声明,如果没有显示提供析构函数,编译器就生成默认的析构函数,它是一个公共或内联的析构函数。
注意:对象的析构顺序与创建相反,先创建的对象最后释放。
9、引用除了作为参数(如拷贝构造函数)外,还可作为数据成员,虽然不常见
作为数据成员,唯一注意的是,它的初始化,不是用赋值,而必须是用列表法