1.函数可以嵌套调用,但不可以嵌套定义。
2.在都不是虚函数的情况下,delete派生类对象(非基类指针指向)调用派生类的析构函数、然后调用基类的析构函数。delete派生类对象(基类指针指向)只调用基类的析构函数。虚函数情况下delete派生类对象(非基类指针指向)和delete派生类对象(基类指针指向)都会调用派生类的析构函数、然后调用基类的析构函数。
3.正如其他的普通的变量一样,形参的类型决定了形参与实参的结合方式。如果一个形参是引用类型,那么这个形参被绑定到实参上,成为实参的别名;如果形参不是一个引用类型,那么实参的值将被拷贝并赋予形参。
当一个形参是一个引用类型,我们说它对应的实参被“引用传递”或者说当前函数被“引用调用”。正如普通的引用一样,一个引用形参是其所绑定的实参的别名。
当一个实参被拷贝并赋予形参,形参与实参便从此分道扬镳,成为无关的两个对象。我们说这样的实参被“值传递”或者说当前的函数被“值调用”。
指针形参的行为和任何非引用类型一致。当我们拷贝一个指针,实际上是指针中所存储的地址值被拷贝。拷贝后,两个指针再无瓜葛,成为两枚独立的指针。
4.
class
Empty{
public
:
Empty();
// 缺省构造函数//
Empty(
const
Empty& );
// 拷贝构造函数//
~Empty();
// 析构函数//
Empty& operator=(
const
Empty& );
// 赋值运算符//
Empty* operator&();
// 取址运算符
const
Empty* operator&()
const
;
// 取址运算符 const
};
以上是空类默认产生的。
5.
除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载
但是=、()、[]、->这四个不能重载为类的友元函数。
6.与C++不同的是,C语言中不能在struct C定义中直接使用C来定义指向下一个变量的指针,而是需要加上struct关键字。C++就不用了。
7.
- 一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。
- 以下一些双目运算符不能重载为类的友元函数:=、()、[]、->。
- 类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。 C++提供4个类型转换函数:reinterpret_cast(在编译期间实现转换)、const_cast(在编译期间实现转换)、stactic_cast(在编译期间实现转换)、dynamic_cast(在运行期间实现转换,并可以返回转换成功与否的标志)。
- 若一个运算符的操作需要修改对象的状态,选择重载为成员函数较好。
- 若运算符所需的操作数(尤其是第一个操作数)希望有隐式类型转换,则只能选用友元函数。
- 当运算符函数是一个成员函数时,最左边的操作数(或者只有最左边的操作数)必须是运算符类的一个类对象(或者是对该类对象的引用)。如果左边的操作数必须是一个不同类的对象,或者是一个内部 类型的对象,该运算符函数必须作为一个友元函数来实现。
- 当需要重载运算符具有可交换性时,选择重载为友元函数。
8.字符串输出的时候的一些问题:
1:字符串长度比设定长度大就按字符串实际长度输出;
2:字符串长度比设定长度小就按右对齐输出该字串,左补空格。
9.函数指针在C++premier plus上写的很清楚,函数指针可以 直接用f1(s) 也可以用 (*f1)(s) 。
10.模板的一些说明
模板的声明和定义不能分别单独的放在.h和.cpp文件中的原因是当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。若在main()函数中包含.h文件,则编译器无法知道模板的确切定义,所以要在main()中包含.cpp文件,.cpp文件中又会包含.h文件,这样一来通过在main函数中包含.cpp文件就会将类的定义和声明都包含进来,编译器自然能找到模板的确切定义。(在main函数中引用)。