C++程序设计教程--读书笔记 第八章 类

第八章
 
一、知识点
1、成员函数在定义时不需要日期类参数,而普通函数却必须有,这是因为,成员函数在调用时因为捆绑了对象,其实已经含有对象参数了。(P277)
 
2、C++ 类定义体的花括号对的后面一定得有分号。(P278)
 
3、只要是在类定义中包含的成员函数,就有默认声明内联的性质,也就是说,该成员函数出于被编译自动安排到最佳运行性能的状态。因此,为了获取最佳性能,就应在类编程设计时,尽量把成员函数写入类定义中。(P278)
 
4、如果对象是以对象指针间接访问的形式操作的,则对象与成员函数之间就用双字符的箭头“->”,即形式:(P279)
objectName->memberFunctionName(parameters);
或者将对象指针的间访形式用括号括起来,再加点操作符“.”加成员函数。即形式:
(*objectPointer).memberFunctionName(parameters);
 
5、能够成为常成员函数的,应尽量写成常成员函数形式。常成员函数的声明和定义在形式上必须一致,即在函数形参表的右括号后面加上const。例如:
class Data{
     int year, month, day;
public:
     bool isLeapYear()const;
};
 
inline bool Data::isLeapYear()const{
     return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
在常成员函数中,任何改变对象值的操作,都将被编译器认定为错误。(P280)
 
6、C++操作符重载的限制:(P284)
(1)、不能创建新的操作符,如‘@’、‘**’。
(2)、C++还规定双目操作符"::"、"."、".*"不能重载。此外,"?:",以及sizeof 和typeof 也不允许重载。
(3)、重载操作符后,其优先级和结合性是不会改变的。
(4)、重载操作符后,操作数个数也不会改变。
(5)、操作符的重载只能针对自定义类型,这个性质使得操作符重载专门用于类对象的操作。
 
7、在设计函数时,参数若为类类型,则一般都用引用型;若为内部数据类型,则不用引用型。(P285)
 
8、Point的+操作返回Point类的值,而<<操作返回流的引用
+操作的结果表示一个函数调用的结果,它是一个Point类型的值表达式,并不要求驻留在一个确定的地方,仅仅要求能参与别的Point值的其他操作即可。这个表达式是临时的,它将随表达式而变,在整体表达式求值结束时,也就了结了自己的生命。
"cout << a;"的结果是cout流,加上操作符的左结合性,所以其<< 可以进行"cout << .. << .. << ..;"式的重叠操作。重载流的<<操作时,为了保持cout的这一性质,其返回值也必须是流。与+操作不同的是,+操作返回的是另一个临时对象,而<< 返回的cout是特定某个输出设备的流对象。若<<返回一个非引用型的流,返回时将对cout进行复制,产生一个临时的流,它会随着重叠操作而引起更多不必要的创建流操作,导致内存浪费和性能下降。(P286)
 
9、后增量操作的结果是增量之前的变量值,它是临时变量,当表达式计算工作完成后,该临时变量随机消失,所以变量最终值与后增量结果是错位的。如下:
(b++)++;
++(d++);
这样的表达式都是错误的,因为表达式必须是可修改的左值。(P286)
 
10、前增量操作数与返回值是同一个变量。在反映对象的前增量操作时,要求参数为对象的引用,返回的仍然是该对象参数的引用:(P286)
X& operator++(X& a);
++a;
然后,后增量操作符重载,同样要求参数为对象的引用,因为在调用的上下文中,实参将发生变化,而返回则为临时对象,所以为非引用的对象值。
X operator++(X&a, int b);
a++;
参数中的int主要是用来与前增量操作区分开来。
 
11、成员操作符和普通操作符不同的是,成员操作符定义中省略了第一个参数,因为成员函数总是与对象捆绑使用的,被捆绑的对象就是被操作的第一个参数。重载<<操作符使其可以理解Point类型时,要自定义针对Point的流<< 操作。由于该<<操作的前置对象是流类型的cout,不是Point类型,所以不能把该<<操作设计成Point的成员,只能设计成普通函数。(P288)
 
12、一般来说,在公开场合,对象实体只可以被整体操作,而不能直接访问对象内部的数据分量。Class类定义体中,若没有前导的访问控制符,就默认为private。成员一旦定性为私有,外界就不能直接访问,而只能通过类的内部成员去间接访问。类的数据成员本质上应该是私有的,而成员函数应该是公有的,但这不是绝对的。(P289)
 
13、C++也将struct纳入了类机制中。也就是说,struct也可以像class那样包含成员函数。它与class的区别仅在于关键字不同,默认的访问控制符不同。struct的默认访问控制符为public而class的默认访问控制符为private。(P289)
 
14、在类中,有一些对象不是类中每个对象分别拥有的,而是共有的。这些共有的属性有些是变化的,如类对象创建的计数值,有些是不变的,如日期类中要用到的12个月的名称,它是一个数组。这些属性不应该作为全局变量,因为它们是专属于某个类的。这些属性也不应该是数据成员,因为不能让每个对象都单独拥有它。类的静态成员,保证每个类只有一个实体,每个对象中不再有它的副本。由于静态成员脱离对象而存在的性质,所以该实体应在所有对象产生之前存在,因此,更适当的时机是在程序启动的时候,做其初始化。(P297)
 
15、将静态成员做成私有的,用静态成员函数去访问静态数据成员是合适的。(P300)
 
16、在类中声明静态成员函数,要在成员函数名前加上关键字static。静态成员函数并不受对象的牵制,可以用对象名调用静态成员函数,也可以用类名加上域操作符调用静态成员函数,这时候,将它看做是某个名空间的一个函数。(P301)
 
17、静态成员函数的实现位置与成员函数的实现位置应该是一起的,静态成员函数如果不在类中实现,而在类的外部实现时,类名前应免去static关键字。成员函数的静态性只在第一次声明的时候才是必要的。(P301)
 
18、将一个普通函数声明为类的友元,就可以直接访问类的私有数据。友元还经常用在操作符重载中,以使操作符有很好的性能。例如:(P304)
friend ostream& operator <<(ostream& o, const Point& d);
inline ostream& operator << (ostream& o, const Point& d){
     return o<< '(' << d.x << ',' << d.y << ')' << '\n';
}
友元函数的定义一般放在类的实现中。成员函数可以是另一个类的友元。整个类也可以是友元,此时,称该友元为友类。友类的每个成员函数都可以访问另一个类中的私有成员。
posted on 2012-05-01 09:57  谷堆旁边  阅读(307)  评论(0编辑  收藏  举报