1.
类成员str是一个指针,因此构造函数必须提供内存来存储字符串。否则str只保存了地址,而没有在堆中指向的内存创建足够的内存并创建字符副本
2. 必须在析构函数中使用delete来在对象使用结束时释放初始化时创建的内存
应该定义复制构造函数
应该定义赋值函数
3. 默认构造函数,如果没有定义构造函数
默认析构函数;复制构造函数;赋值运算符;地址运算符-返回调用对象的地址。
编译器会生成这些函数的定义,默认构造函数和默认析构函数都是空函数,不做任何操作。复制构造函数逐个复制非静态成员,复制的是成员的值,也称为浅复制
赋值运算符函数先使用复制构造函数创建一个临时对象,然后通过赋值将临时对象的值复制到新对象中,也是浅复制
4.
nifty::nifty( )
{
personality = new char [1];
personality[0] = '\0';
talents = 0;
}
nifty::nifty(char *s)
{
personality = new char [strlen(s)+1];
strcpy(personality, s);
talents = 0;
}
另外至少还得有一个析构函数来delete [] personality;
5. 答案不是很确定,高手请指正
a.
#1 Golfer();
#2 Golfer(const Golfer & g);
#3 Golfer(const char * name, int g = 0);
#4 Golfer();
# 5 默认复制函数
#6 Golfer(const Golfer & g) + 默认赋值运算符函数
#7 默认赋值运算符函数
#8 Golfer(const Golfer & g) +默认赋值运算符函数
应定义复制函数和赋值运算符函数