清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点
- 定义类时只能在类中声明数据成员,而不能对数据成员进行初始化。
- 成员函数一般最好放在外面(除了极短的函数,不需要函数原型,函数名前也不需要类名和作用域运算符::)
- 程序通过空间的共享来实现数据的交换:
- 全局变量,但破坏了面向对象程序的封装特性
- 静态数据成员 static,类的静态数据成员可以被该类的所有对象共享
- 类的静态成员包括静态数据成员和静态成员函数,即使没有创建对象,它也已经存在且可以被访问,通过类名加作用域运算符。
- 静态数据成员必须在定义类的时候初始化,但不能在类里面初始化,只能在类外面进行,比如和成员函数的实现一起
- 静态成员函数只能访问类的静态成员,不能调用类非静态函数和数据,而非静态函数都可以。
对象的建立 | Circle one; Circle array[10]; Circle *ptr = &one; Circle &o = one | Circle *pone,*pten; pone = new Circle; pten = new Circle[10]; |
---|
- 防止类的头文件多次被源文件包含而导致,类多次被定义而出现重复定义,因而在定义类时加上预处理指令:
#if !defined CIRCLE_H #define CIRCLE_H #endif
构造函数:
- 定义构造函数前不能有返回类型存在,比如 void Circle()就是错误的
- 构造函数执行:
- 全局对象:定义在所有函数外面的对象,具有文件作用域
- 局部动态对象:定义在程序块内,具有块作用域
- 局部静态对象:定义在程序块内,具有块作用域,static关键字,只在第一次被建立一次,存在于整个生命周期
- 动态创建的对象(用new运算符创建)
- 构造函数重载:根据声明对象或者创建对象时提供的参数来确定调用哪个函数
- 默认构造函数:在构造时不提供参数的构造函数
- 默认构造参数,Circle(double a=5.0,double b=5.0),在声明对象时不提供,也可以提供,也可以提供一部分(参数全是默认参数的构造函数也是默认构造函数)
- 复制构造函数:根据类的某个对象复制出一个完全相同的新的对象的构造函数
- 例如定义带参数的构造函数Circle(int a){x=a;}复制构造函数Circle(Circle &C){x=c.x;},
- 使用时例如:Circle a(8);Circle b(a);
- 如果没有定义,编译时也会自动加入完成数据成员复制的构造函数
- 如果对象中包含指向动态分配空间的指针数据成员时要注意,不能简单的赋值,要为当前新建对象的指针数据成员分配新空间。。。。什么时候找个案例(黑马,P28创建自己的异常类那里,catch对象那里采用了复制构造,结果新老对象数据指针指向 同一个地方,当执行折构函数时导致出错)(或者catch对象的引用,可以避免调用构造函数)
折构函数:
- 如果类的对象包含动态分配的空间时,如之前定义的 Stack类,必须使用折构函数,否则没有必要
- 不同类型的对象折构函数的执行时机:
- 全局对象,在所有程序执行完后被撤销销,在main函数最后一条语句或者程序执行exit语句后,折构函数被执行。
- 局部动态对象,在退出该对象作用域时撤销,折构函数在退出该程序块时被执行。但以exit,abort终止执行,则折构函数不被被执行
- 局部静态对象,在所有程序执行完或执行exit时折构函数被执行,且在全局对象折构函数执行前被执行。在退出在退出该程序块前以abort终止执行,则折构函数不被被执行。
- 动态创建的对象(用new)必须动态执行,在delete操作时执行
类和对象的使用:
- 类的复合:定义一个类时,把其他类的对象作为自己的成员 ,列如:
圆类构造函数的声明:Circle(double a=5.0,double b=5.0,double c=5.0); 圆柱类构造函数的声明:Column(double a=5.0,double b=5.0,double c=5.0,double c); 数据成员包含Circle circle; 定义构造函数时: Column::column(double a=5.0,double b=5.0,double c=5.0,double c) : circle(a,b,c) :后面接成员对象名,可以有多个对象,列出参数(对象构造函数的显式调用)不需要参数(隐式调用) 成员对象会在包含他的对象创建之前被创建 撤销时执行折构函数时也会自动调用成员对象的折构函数 Column中的成员函数无法访问Circle其私有属性
- this指针:每个对象维护的指向自身的指针(当一个对象调用成员函数的时候,为了保证它当前要操作的数据时这个对象的数据成员,而不会访问到其对象)类型是Circle *const,每个成员函数都会获得这个隐含参数。
- 成员函数不仅可以用数据名data去访问,也可以通过this->data去访问
- this指针指向对象自身的首地址,指针复引用this可以帮助对象获取对象自身,(如果一个类的成员函数返回值是this,程序就可以用这个返回值去调用另外一个成员函数)定义函数返回类型Circle &
- 静态成员函数不维护this指针,对象调用静态成员函数不传递this指针,因此静态成员函数不能访问非静态数据成员,同理非静态成员函数也不能调用静态成员函数。
- const
- 声明const对象,const Circle baseCircle(0.,0,1);
const对象不能调用非const成员函数 const对象的初始化在构造函数中进行,初始化后不允许被修改 - 类的const成员函数不允许修改定义于类中的数据成员 void Circle::print() const
类的const成员函数不允许调用非const成员函数 - const数据成员在构造函数中初始化,但不能通过赋值进行。const double r;
在构造函数的头部中给出,由冒号引出const数据成员和相应的初始化值 Circle::Circle(double a,double b,double c):r? //引用也是一样,必须这样显式的初始化 - 总之,const成员函数不能修改对象,const对象不允许被任何程序修改
- 非const对象,非const函数可以随意。
- 友元函数
一个类的函数是该类的外部函数,他有权访问类的所有成员。声明方法:在类的定义中加入该函数的函数原型,并将关键字friend放到函数原型前面。 (建议不用友元,除非有极大的便利)friend void aa(int a) - 友元类
类名前加friend ,友元类的声明是单方面的,不可传递的,反着来不行。
|