2021-03-02 C++ Primer Plus 第十二章 类和动态内存分配 复习题

复习题

1. 假设String 类又如下私有成员:

a.下述默认构造函数有什么问题?

该构造函数未初始化String类私有域中的变量。

b.下述构造函数有什么问题?

str=s s会把其地址的值赋给str,应该使用strcpy函数复制参数的值且用new开辟一块内存空间。

c.下述构造函数有什么问题?

需要根据传入参数的大小,为str开辟一块内存空间,new char[strlen(s)+1]

2.如果您定义了一个类,其指针成员是使用new初始化的,请指出可能出现的3个问题以及如何纠正这些问题。

  1. 当指针成员过期时,指针指向的对象仍然保存在内存中,且无法访问该对象。可以通过调用类析构函数来释放new分配的内存。
  2. 当该类的对象A1被复制后产生了该类的对象A2,A1中的指针成员和A2中的指针成员指向同一个地址,当A1调用析构函数后,其指针成员指向的内容也一并被释放,此时,A2中相同的指针成员会丢失指向的目标,从而产生不确定的后果。可以通过定义类复制构造函数,进行深度复制,也就是说应当复制指针指向的内容而不是指向的地址(浅复制)。
  3. 将一个对象赋给另一个对象时,也会导致其指针成员成员指向同一个地址。可以通过重载=运算符,使之复制数据,而不是指针。

3.如果没有显式提供类方法,编译器将自动生成哪些类方法?请描述这些隐式生成的函数的行为。

  1. 自动生成默认构造函数
  2. 自动生成默认析构函数
  3. 自动生成默认复制构造函数

4.找出并改正下述类声明中的错误:

class nifty{
private:
    char *personality;
    int talents;
public:
    nifty();
    nifty(char *s);
    ~nifty(){delete [] personality;};
    friend  ostream & operator<<(ostream & os,nifty & n);
};
nifty::nifty() {
    personality = nullptr;
    talents = 0;
}
nifty::nifty(char *s) {
    personality = new char[strlen(s)];
    strcpy(personality,s);
    talents=0;
}
ostream & operator<<(ostream & os,nifty & n)
{
    os << n.personality<< std::endl;
    os << n.talents << std::endl;
    return os;
}

5.对于下面的类声明:

class Golfer{
private:
    char * fullname;
    int game;
    int * scores;
public:
    Golfer(); //默认构造函数#1
    Golfer(const char *name,int g=0);//构造函数#2
    Golfer(const Golfer &g);//复制构造函数#3
    ~Golfer();//析构函数
};

a.下面各条语句将调用哪些类方法

Golfer nancy;//调用构造函数#1
Golfer lulu("Little Lulu");//调用构造函数#2
Golfer roy("Roy Hobbs",12);//调用构造函数#2
Golfer *par = new Golfer;//调用构造函数#1
Golfer next = lulu;//调用构造函数#3
Golfer hazzard = "Weed Thwacker";//调用构造函数#2
*par = nancy;//调用默认的赋值运算符
nancy="Nancy Putter";//先把“Nancy Putter”初始化为一个对象(调用构造函数#2),再调用复制构造函数#3

b.很明显,类需要有另外几个方法才能更有用,但是类需要哪些方法才能防止数据被损坏呢?

需要重构赋值运算符=

你可能感兴趣的:(2021-03-02 C++ Primer Plus 第十二章 类和动态内存分配 复习题)