钱能C++语言读书笔记(一)
1、 头文件的内容
1.1函数的声明:int Fun(); void Max();
1.2全局数据的声明:extern int n;
1.3类型声明:class A{};
1.4全局常量定义:const float PI = 3.1415926;
1.5内联函数定义:inline void fn();
1.6模板声明和定义:template<class T> class A {…};
1.7名空间定义:namespace N{};
1.8类型定义:enum Color{}; class A{};
1.9预编译指令: #include <iostream>
1.10注释://2011年2月22日8:44:39
2、 static的标示含义
在程序中,有的函数是为了文件中的其他函数服务的,并不对外提供服务,这些函数应
声明为静态的(static)表示局部于程序文件。同样有的变量只为本文件服务也不是全局数据,应标为static,这些函数和变量称为静态全局函数和静态全局变量,它只在本文件范围内可见,在其他程序文件中不可见。
3、 界面头文件(Header File as Interface)
头文件更重要的作用是在设计阶段(相对于编程阶段)规定界面,也就是通过头文件可以明白地看出某个程序文件提供了声明服务,这种头文件称为用户界面。例如:程序文件ad.cpp所提供的用户界面为ad.h。
4、 不能重载的操作符
“::”,“.”,“.*”,“?:”,sizeof,typedef,new,delete,static_cast,dynamic_cast,const_cast,reinterpret_cast。
5、 操作符重载
操作符重载是针对自定义类型的性质,使得操作符重载专门用于类对象的操作。
6、 增量操作
一个整型变量的增量操作的结果与变量是一致的,而且前增量的操作的结果是左值,操作可以连贯,而后增量操作的结果是增量之前的变量值,它是临时变量,当表达式计算工作完成后,该临时变量随即消失,所以变量最终值与后增量结果是错位的。
7、 匿名对象
创建对象时如果不给出对象名,也就是说直接以类名调用构造函数,则产生一个无名对象,无名对象经常在参数传递时用到。例如:
cout << Date(2011, 2, 22) << endl;
Date(2011, 2, 22)是一个对象,该对象在做了<< 操作后便烟消云散了,所以这种对象一般用在创建后不需要反复使用的场合。
8、 常量是不能做左值的
对一个已经创建了的常量,在赋给新值是没有道理的,引用只能在创建的时候进行变量实体的对应,对一个已经存在的引用来说赋值语句并不代表再次与变量对应。也就是说在构造函数体中是不能完全对常量成员和引用成员进行初始化的。
9、 成员对象以其在类中声明的顺序构造。
10、
拷贝构造函数名也是类名,它是构造函数的重载,一旦自定义了拷贝构造函数,默认的拷贝构造函数就不再起作用了。拷贝构造函数的参数必须是类对象的常量的引用:
Person(const Person & s);
因为对象复制的语义本身尚处于当前定义当中,参数传递若为传值形式,则对象复制操作的调用的拷贝构造函数在哪里呢?所以只能是引用或者是指针。但是指针参数将影响复制的语法:
Person p2(*p1);//或者Persion p1 = * p2;
这种语法并不优雅,所以用对象的引用。
const限定符有两个作用,一个是防止被复制的对象”变样”,另一个是扩大使用范围。有一条编程经验,就是自定义对象作为参数传递,能用引用就尽量使用引用,能用常量引用的尽量使用常量引用。因为被复制的对象也有可能是常对象。
如果拷贝对象是常对象,而拷贝构造函数的参数不是常量引用,也就是说,置一个常对象可能被修改的危险之中,这是编译器无论如何也要奋不顾身地报告错误的。
在自定义拷贝构造函数之前,我们进行拷贝对象构造时,都是在用默认的拷贝构造函数,因为那个时候的对象本体与对象实体是一致的。所以,自定义拷贝构造函数在对象本体与对象实体不一致时,便是需要的,否则无此必要。当对象本体与对象实体一致时,起拷贝构造称为浅拷贝,当对象本体和对象实体不一致时,其拷贝称为深拷贝。深拷贝需要动态内存的分配工作。