大一下学期疑难知识总结目录:点击打开链接
7.
C++也支持面向过程的程序设计,不是一个纯正的面向对象的语言
8.
面向对象:程序 = 对象 + 消息
面向过程:程序=过程+调用
9.
分类所依据的原则——抽象。
类和对象之间的关系是抽象和具体的关系。
10.
类的成员可以是其他类的对象,但不能以类自身的对象作为本类的成员。
11. 直接在类中实现的成员函数自动成为内联函数。(不需要特殊的说明)
12. inline是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
void Fun(int x, int y);
inline voidFun(int x, int y) {…} // inline与函数定义体放在一起
13. 当&a的前面有类型符时(如int&a),它必然是对引用的声明;如果前面无类型符(如cout<<&a),则是取变量的地址。
14. 不能通过常引用对目标变量的值进行修改,这一特性在使用引用作为函数形参时有用,因为有时希望保护形参的值不被改变。
15. 不能建立数组的引用,但可以建立数组元素的引用
16. 不能用void声明引用
17. 引用必须初始化,而一旦被初始化后不得再作为其它变量的别名。指针可以被重新赋值以指向另一个不同的对象。
18. 不存在指向空值的引用,指针则可以是NULL。
19.可以建立指针变量的引用,不能建立引用的引用
20. int i=5;
int *p=&i;
int *&pt=p;//pt是一个指向整型变量的指针变量的引用,初始化为p
1. 引用作为形参,实参是变量而不是地址,这与指针变量作形参不一样。
2. 引用类型作为函数返回值时,注意不要返回对该函数内的自动变量(局部变量)的引用。
3. 由于自动变量的生存期仅局限于函数内部,当函数返回时,自动变量就消失了,上述函数返回一个无效的引用。一般这个变量是全局变量或静态局部变量,即存储在静态区中的变量。
4. 同类型的对象之间可以整体赋值,这种赋值与对象的成员的访问权限无关。
5. 当进行"string"变量和字符串字面值混合连接操作时,“+”操作符的左右操作数必须至少有一个是"string"类型的.
6. String基本操作函数
a) string s; //生成一个空字符串s
b) string s(str) //拷贝构造函数 生成str的复制品
c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值
d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值
e) string s(cstr) //将C字符串作为s的初值
f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。
g) string s(num,c) //生成一个字符串,包含num个c字符
h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值
7.公有成员赋初值(如果都是公有成员)
class Date
{public:
intd, m, y;
}
Date today = {11,11,2011}; // 将today初始化为d:11,m:11,y:2011
8.析构函数没有返回值,不能有参数,不指定函数类型
9.实参与形参的结合是从左至右顺序进行的。因此指定默认值的参数必须放在形参表列中的最右端,否则出错。
10. 一个函数不能既作为重载函数,又作为有默认参数的函数
11. 在函数调用时,若某个实参省略,则其后的参数皆应省略而采用缺省值。不允许某个参数省略后,再给其后的参数指定参数值.
12.
如果程序中既有函数的声明又有函数的定义时,默认参数在函数声明中提供。定义函数时不允许再定义参数的默认值。
例子:
void fun(int x = 0,int y = 0);
void main(){}
void fun(int x = 0, int y = 0){ } // error
13.
函数可以重新说明使原来不带缺省值的参数带上缺省值,但已经指明缺省值的参数不能重新说明。
正确代码:
void initialize(int printNo,int state=0)
void initialize(int printNo=1,int state)
错误代码:
void initialize(int printNo,int state=0)
void initialize(int printNo,int state=1)
14.
在类中,没有参数的构造函数,或各参数均有缺省值的构造函数都称为默认的构造函数,一个类中,默认的构造函数只能有一个。
15.
new开辟的内存单元,在此期间,指针不能重新赋值,用new开辟的空间只能用delete显式地释放。
16. 内存的动态分配是否成功进行检查
if(!p)
{cout<<“allocation failure”<<endl;
return 1; }
17.
在撤消对象时,系统自动收回为对象所分配的存储空间,而不能自动收回由new分配的动态存储空间。
18.
以下三种情况下由编译系统自动调用复制构造函数:
a) 声明语句中用类的一个已知对象初始化该类的另一个对象时。
b) 当对象作为一个函数实参传递给函数的形参时,需要将实参对象去初始化形参对象时,需要调用复制构造函数。
c) 当对象是函数的返回值时,由于需要生成一个临时对象作为函数返回结果,系统需要将一个对象的值初始化临时对象,需要调用复制构造函数。
19
c3=c2; //此时为赋值操作,不会调用复制构造函数
Complex c3= c1; // 调用复制构造函数Complex(Complex & c),兼容c的风格
18.
用指向对象的指针来访问对象成员时,要用“->”操作符.
19.
“指向类成员的指针”这样的描述中有“指针”一词,其实它并不是真正的指针,因为它既不包含地址,行为也不像指针。
1) 与常规指针不同,一个指向类成员的指针并不指向一个具体的内存位置,它是指向类的特定成员,而不是指向某个类特定对象里的特定成员。
2) 其值为数据成员在类内的偏移量(offset)(注:只能用printf()才能输出正确的偏移量,用cout输出均为1)
20.
int (Coord::*pc_getx)(); //声明成员函数指针pc_getx ①
pc_getx=Coord::getx; //给成员函数指针pc_getx赋值 ②
21.
一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果。
22.
sizeof 运算符不会计算静态数据成员
23.
1) 静态数据成员是在所有对象之外单独开辟空间,在声明对象时,并不为静态数据成员分配空间。
2) 静态数据成员不属于某一个对象。即使不定义对象,也为静态数据成员分配空间,也可以通过类名直接引用它。
24.
类的静态数据成员是静态分配存储空间的,而其它成员是动态分配存储空间的(全局变量除外),当类中没有定义静态数据成员时,在程序执行期间遇到声明类的对象时,才为对象的所有成员依次分配存储空间,这种存储空间的分配是动态的;而当类中定义了静态数据成员时,在编译时,就要为类的静态数据成员分配存储空间。
25.
在C++中,静态数据成员缺省的初值为0,所以静态数据成员总有唯一的初值。
26.
静态成员函数仅可以直接访问同一类的静态成员(静态成员函数或是静态数据成员)以及全局变量
27.
静态成员函数与非静态成员函数的根本区别:非静态成员函数有this指针,静态成员函数没有this指针。由此决定了静态成员函数不能访问本类中的非静态成员。
28.
一定要先定义类,再定义友元函数,否则编译报错
29.
对象成员初始化的顺序与对象成员的在类中声明的顺序有关,与在初始化列表中的顺序无关
30.
常对象必须在定义时有初值
31
使用常对象时应该注意的问题
C++规定常对象只能调用它的常成员函数、静态成员函数(除了由系统自动调用的构造函数和析构函数)。
常对象能调用其数据成员,但不能修改数据成员的值。
32.
如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对常数据成员进行初始化,而任何其他函数都不能对该成员赋值
33.
只有常成员函数才能操作常量或常对象,常成员函数不能调用非const修饰的成员函数(静态成员函数除外)即只能调用常成员函数和静态成员函数。
非const成员函数不能用来操作常对象。
34.