explicit,写在声明构造函数的函数名的前面,限制使用时必须显示地调用。(P418-P419)
§转换函数是类成员,没有返回类型、没有参数、名为operator typeName(),其中,typeName是对象将被转换成的类型。(P415)
§静态类成员的特点:类的所有对象共享同一个静态成员。不能在类声明中初始化静态成员变量。初始化语句指出了类型,并使用了作用域运算符,但没有使用关键字static。但对于静态数据成员为const整数类型或枚举型(P371-P372)。
§在构造函数中使用new来分配内存时,必须在相应的析构函数中使用delete来释放内存。
§当使用一个对象来初始化另一个对象时,复制构造函数被调用。(P433)
§delete[]与使用new初始化的指针和空指针都兼容。(P447/P438)
§不能通过对象调用静态成员函数,如果静态成员函数是在公有部分声明的,则可以使用类名和作用域解析运算符来调用它。
§返回对象将调用复制构造函数,而返回引用不会。特别是返回临时对象,由于程序执行完这个函数后就会执行临时对象的析构函数,这时如果是返回临时对象的引用就会出错。(P450)
§声明了一个String的类 const int ArSize =10; String sayings[ArSize];
声明指向类对象的指针: String * glamour;
将指针初始化为已有的对象: String * first = &sayings[0];
使用new和默认的类构造函数对指针进行初始化: String * gleep = new String;
使用new和String(const String&)类构造函数对指针初始化:
String * favorite = new String(sayings[choice]);
使用->操作符通过指针访问类方法:sayings[0].length()或者first->length();
使用*解除引用操作符从指针获得对象:*first=sayings[0];(P455)
§只有构造函数可以使用这种初始化列表语法,特别是对const和引用的类的初始化时必须使用这种初始化的方式。(P464)
class string
{...}
class Agent
{public:
string belong;
Agent(string& a);/引用了string类,故要用初始化成员列表
...
};
Agent::Agent(string& a):belong(a)
§派生类不能直接访问基类的私有成员,而必须通过基类方法进行访问;派生类需要自己的构造函数;派生类可以根据添加额外的数据成员和成员函数。
§ 基类指针可以在不进行显示类型转换的情况下指向派生类对象;基类引用可以在不进行显示类型转换的情况下引用派生类对象。这个仅单向性,反过来派生类的指针或引用不可以用于基类。(P488)
§当一个函数的形参为一个基类的引用时,它可以指向基类对象或派生类对象。若指向派生类对象,那么函数在被调用时会使用基类对象的复制构造函数。(P489)
§编译器对非虚方法使用静态联编,对虚方法使用动态联编。(P503)
§析构函数应当是虚函数,除非类不用做基类。(P505)
§友元不能是虚函数,因为友元不是类成员,而只有成员才能是虚函数。(P505)
§派生类对基类的某一函数的重新定义不等同于函数的重载。第一,如果重新定义继承的方法,应确保与原来的原型完全相同,但如果返回类型是基类引用或指针,则可以修改为指向派生类的引用或指针。第二,如果基类声明被重载了,则应在派生类中重新定义所有的基类版本。(P506)
只有plus(int a,int b)在D类里重新定义了才能继续使用。