非const引用只能绑定到与该引用同类型的对象;
const引用则可以绑定到不同但相关的类型的对象或绑定到右值。
因为头文件包含在多个源文件中,所以不应该含有变量或函数的定义。这个规则有三个例外,头文件可以定义类、值在编译时就已知道得const对象和inline函数。这些实体可在多个源文件中定义,只要每个源文件中的定义是相同的。
C++ const变量在实际编程中起着非常重要的作用,当我们在声明时,需要对其加初始化,因为默认的内部连接都必须被初始化。
指针和引用:
它们之间有两个重要的区别。第一个区别在于引用总是指向某个对象:定义引用时没有初始化对象是错误的。第二个重要的区别则是赋值行为的差异:给引用赋值修改的是该引用做关联的对象,而并不是使引用与另一个对相关联。引用一经初始化,就始终指向同一个特定对象(这就是为什么引用必须在定义时初始化的yuanyin)
typedef和#define的区别
1.可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。
例: #define peach int
unsigned peach i; //ok
typedef int banana;
unsigned banana i; //error,illegal
2.在连续几个变量的声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证
例: #define int_ptr int*
int_ptr chalk, cheese; //chalk is int*, but cheese is int
typedef char * char_ptr;
char_ptr Bentley, Rolls_Royce; //both Bentley and Rolls_Royce are char *
注意c++中: typedef string *pstring
const pstring cstr;
上面声明中cstr为指向string类型对象的const指针,相当于srting * const cstr;
int *ip[4]; //array of pointers to int
int (*ip)[4]; //pointer to an array of 4 ints
c++中规定了计算其操作数次序的操作符有:&&,||(这两个操作符的操作数计算顺序导致了短路现象),?:(条件操作符)和,(逗号)。
const引用比非const引用更加灵活,因为const引用能接受const类型、非const类型、右值以及其他可转换成该类型的值,例如short a = 0; const int& b = a;,而非const型引用只能接受和自己类型完全相同的值,不能接受其他类型、const引用或右值。
没有默认构造函数的类类型的成员,以及const或引用类型的成员,不管是哪种类型,都必须在构造函数初始化列表中进行初始化。
c++容器中的元素不能是引用类型,输入输出标准库类型和auto_ptr类型。
函数的参数声明为const型的引用或指针的好处是调用该函数时既可以给该参数传递const的引用或指针,也可以传递非const型的引用或指针,而如果参数声明为非const型,则调用函数时只能为其传递非const型的引用和指针。
虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在基类的派生类中对虚函数重新定义,在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,以实现统一的接口,不同定义过程。如果在派生类中没有对虚函数重新定义,则它继承其基类的虚函数。
class Base {
public:
virtual int fcn(){return 0;}
};
class D1 : public Base {
public:
// hides fcn in the base; this fcn is not virtual
int fcn(int a){return a;} // parameter list differs from fcn in Base
// int fcn(){return 1;}
// D1 inherits definition of Base::fcn()
};
class D2 : public D1 {
public:
int fcn(int a){return a;} // nonvirtual function hides D1::fcn(int)
int fcn(){return 2;} // redefines virtual fcn from Base
};
D1中的int fcn(int a)只是对外屏蔽了Base类里的fcn(屏蔽接口),但实际D1类中依然保存了Base类里的fcn的实现(未屏蔽实现),所以D2才可以重定义Base类的fcn实现多态。
D1 d1obj;
D1 *pd1 = &d1obj;
pd1->fcn(1): //OK
pd1->Base::fcn(): //OK
pd1->fcn(): //error: no matching function for call to 'D1::fcn()'|(屏蔽接口)
自动化