int main() {
int *a = Fn1();
cout <<\delete a; return 0; }
int* Fn1() {
int * p = new int (5); return p; }
5-16引用和指针有何区别?何时只能使用指针而不能使用引用?
解:
指针可以为NULL值,引用是一个别名,不能为NULL值;指针可以被赋值,引用只可以被初始化,不可以被赋为另一个对象的别名;指针可以指向堆中空间,引用不可以指向堆中空间。
当需要对变量重新赋以另外的地址或赋值为NULL时只能使用指针。
5-17 定义一个整型变量a,一个整型指针p,一个引用r,通过p把a的值改为10,通过r把a的值改为5
解:
void main() { int a;
int *p = &a; int &r = a; *p = 10; r = 5; }
5-18 比较值调用和引用调用的相同点与不同点。 解:
值调用是指当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参)。这一过程是参数值的单向传递过程,一旦形参获得了值便与实参脱离关系,此后无论形参发生了怎样的改变,都不会影响到实参。 引用调用将引用作为形参,在执行主调函数中的调用语句时,系统自动用实参来初始化形参。这样形参就成为实参的一个别名,对形参的任何操作也就直接作用于实参。
第 六 章 继承与派生
6-1 比较类的三种继承方式public公有继承、protected保护继承、private私有继承之间的差别。 解:
不同的继承方式,导致不同访问属性的基类成员在派生类中的访问属性也有所不同: 公有继承,使得基类public(公有)和protected(保护)成员的访问属性在派生类中不变,而基类private(私有)成员不可访问。 私有继承,使得基类public(公有)和protected(保护)成员都以private(私有)成员身份出现在派生类中,而基类private(私有)成员不可访问。
保护继承中,基类public(公有)和protected(保护)成员都以protected(保护)成员身份出现在派生类中,而基类private(私有)成员不可访问。
6-2 定义一个哺乳动物Mammal类,再由此派生出狗Dog类,定义一个Dog类的对象,观察基类与派生类的构造函数与析构函数的调用顺序。 解: 源程序:
#include
enum myColor{ BLACK, WHITE }; class Mammal {
public:
// constructors Mammal(); ~Mammal();
//accessors
int GetAge() const { return itsAge; } void SetAge(int age) { itsAge = age; } int GetWeight() const { return itsWeight; }
void SetWeight(int weight) { itsWeight = weight; }
//Other methods
void Speak() const { cout <<\
protected: int itsAge; int itsWeight; };
class Dog : public Mammal {
public: Dog(); ~Dog();
myColor GetColor() const { return itsColor; }
void SetColor (myColor color) { itsColor = color; }
void WagTail() { cout <<\
private:
myColor itsColor; };
Mammal::Mammal(): itsAge(1), itsWeight(5) {
cout <<\}
Mammal::~Mammal() {
cout <<\}
Dog::Dog(): itsColor (WHITE) {
cout <<\}
Dog::~Dog() {
cout <<\}
int main() {
Dog Jack; Jack.Speak(); Jack.WagTail();
cout <<\
return 0; }
程序运行输出:
Mammal constructor... Dog constructor... Mammal sound!
Tail wagging... Fido is 1 years old Dog destructor... Mammal destructor...
6-3 定义一个基类,构造其派生类,在构造函数中输出提示信息,观察构造函数的执行情况。 解:
#include
class BaseClass {
public:
BaseClass(); };
BaseClass::BaseClass() {
cout <<\构造基类对象!\ }
class DerivedClass : public BaseClass {
public:
DerivedClass(); };
DerivedClass::DerivedClass() {
cout <<\构造派生类对象!\}
void main() {
DerivedClass d; }
程序运行输出: 构造基类对象! 构造派生类对象!
6-4 定义一个Document类,有name成员变量,从Document派生出Book类,增加PageCount变量。 解:
#include
class Document {
public:
Document(){};
Document( char *name );
char *Name; // Document name. void PrintNameOf(); // Print name. };
Document::Document( char *name ) {
Name = new char[ strlen( name ) + 1 ]; strcpy( Name, name ); };
void Document::PrintNameOf() {
cout << Name << endl; }
class Book : public Document {
public:
Book( char *name, long pagecount ); void PrintNameOf(); private:
long PageCount; };
Book::Book( char *name, long pagecount ):Document(name) {
PageCount = pagecount; }
void Book::PrintNameOf() {
cout <<\Document::PrintNameOf(); }