C++ Primer Plus(第六版)读书笔记(二)

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

  使用newString(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类里重新定义了才能继续使用。


你可能感兴趣的:(C++)