1、函数的重载:函数名相同,函数的参数个数和类型不同
2、函数声明:函数调用的位置在定义之前,则被调用的函数必须作声明
3、函数模板:定义通用函数,函数的类型和形参类型不具体指定,用虚拟的类型来代表
4、引用与其代表的变量共享同一内存单元,系统并不为引用另外分配存储空间
当看到&a这样的形式时,当及a的前面有类型符时(如int&a),它必然是对引用的声明;
如果前面 没有类型符,此时的&是取地址运算符。
引用常用于:作为函数参数,可以改变实参的同时又不产生内存开销(若使用指针则要开
辟内存)
如swap(int &a),有时也用swap(const int &a)常引用,可以保护形参的值
不被改变
int a = 5;
int *b = &a;
int& *p = &a;//错,不能定义指向引用类型的指针变量,因为引用不是一种独立的数据
类型
int* &p = b;//正确,指向整型变量的指针变量的引用
------注意:变量到底是指针还是引用由离变量最近的符号决定,如int* &p,离p最近
的是&,所 以这是个引用。
5、内置函数:函数左端加关键字:inline
6、作用域运算符:"::"
7、字符串常量以“/o”作为结束符,但将字符串常量存放到字符串变量中时,只存放字
符串本身而 不包括“/o”。因此字符串变量string word="Than"中的字符为"Than
”(共4个字符)而 不是"Than"再加“/0”。
8、new和delete是运算符,不是函数,因此执行效率比malloc函数要和free函数高。new
类型(初值) 或 new 类型[数组大小]
9、类函数一般在类体中作原型声明,在类外定义,这是一个良好习惯,但是成员函数在
类外定义时,必须在函数返回类型与函数名之间加上类名和作用域运算符
10、问题提出: 在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所
花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全
部语句的执行时间。
解决办法: 为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制
结构,C++系统会自动将它们作为内置(inline)函数来处理。
定义方法: C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成
员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。
注意:如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置
(inline)函数
11、C++编译系统为每个对象所占用的存储空间只是该对象的数据部分所占用的存储空间
,而不包括函数代码所占用的存储空间。
12、对象成员的引用:
1.通过对象名和成员运算符访问对象中的成员;对象名.成员名
2.通过指向对象的指针访问对象中的成员; 对象指针名->成员名,(*对象指针名).
成员名
3.通过对象的引用变量访问对象中的成员
13、Student studl,stud2; //Student是已经声明的类类型
应该说明,在C++中,在声明了类类型后,定义对象有两种形式。
①class类名对象名
如class Student studl,stud2;
把class和Student合起来作为一个类名,用来定义对象。
②类名对象名
如Student studl,stud2;
直接用类名定义对象。这两种方法是等效的。第1种方法是从C语言继承下来的,第2
种方法是C++的特色,显然第2种方法更为简捷方便
14、 在成员函数引用本对象的数据成员时,只需直接写数据成员名,这时C++系统会把
它默认为本对象的数据成员。也可以显式地写出类名并使用域运算符。如上面最
后一个
函数的定义也可以写成:
void Time::show_time(){
cout<<Time::hour<<":"<<Time::minute<<":"<<Time::sec<<endl;// 加了
类名限定
}
在执行时,会根据this指针的指向,输出当前对象中的数据成员的值。
15、 在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在
指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在
程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率。
16、用参数初始化表对数据成员初始化。类名(型参列表):数据成员(型参)列表{ }
Box::Box(int h,int w,int len):height(h),width(w),length(len){ }
17、一般不应同时使用构造函数的重载和有默认参数的构造函数
18、析构函数:1、如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数
被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
2、static局部对象在函数调用结束时对象并不释放,因此也不调用析构
函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函
数。
3、如果定义了一个全局对象,则在程序的流程离开其作用域时(如main
函数结束或调用exit函数)时,调用该全局对象的析构函数。
4、如果用new运算符动态地建立了一个对象,当用delete运算符释放该
对象时,先调用该对象的析构函数。
19、构造函数: (1)在全局范围中定义的对象(即在所有函数之外定义的对象),它的构
造函数在文件中的所有函数(包括main函数)执行之前调用。但如果一个程序
中有多个文件,而不同的文件中都定义了全局对象,则这些对象的构造函数
的执行顺序是不确定的。当main函数执行完毕或调用exit函数时(此时程序
终止),调用析构函数。
(2)如果定义的是局部自动对象(例如在函数中定义对象),则在建立对象
时调用其构造函数。如果函数被多次调用,则在每次建立对象时都要调用构
造函数。在函数调用结束、对象释放时先调用析构函数。
(3)如果在函数中定义静态(static)局部对象,则只在程序第一次调用此
函数建立对象时调用构造函数一次,在调用结束时对象并不释放,因此也不
调用析构函数,只在main函数结束或调用exit.函数结束程序时,才调用析
构函数。
20、函数指针:
指向普通函数的定义:数据类型名 (*指针变量名)(参数表列);
如: void (*P)(); //p是指向void型函数的指针变量
p=fun;//将fun函数的入门地址赋抬指针变量P。P就指向了函数fun
(*P)();//调用fun函数
指向成员函数的指针变量定义:数据类型名 (类名::*指针变量名)(参数表列);
指针变量指向一个公用成员函数的一般形式为:指针变量名=&类名::成员函数名;
void (Time::*p2)(); //定义p2为第向Time类中公用成员函数的指针变量
p2=&Time::get_time; //将Time类中公用成员函数get_time的地址赋给指针变量P2
注意:(Time::*p2)括号不能省略