问:类实例和类对象有何不同?
答:基本上就是一回事咯。实例化类的时候,将获得一个实例,它也被称为对象。
问:要访问成员,可使用句点运算符(.),也可以使用指针运算符(->).那哪种方式更好嘞?
答:如果有一个指向对象的指针,使用指针运算符最合适;如果栈中实例化了一个对象,并将其存储到了一个局部变量中,则使用句点运算符最合适。
问:是不是每次都需要写一个复制构造函数?
答:如果类的数据成员是设计良好的智能指针、字符串类或STL容器(如std::vector),则编译器生成的默认复制构造函数将调用成员的复制构造函数。然而,如果类包含原始指针成员(如使用 int*而不是std::vector表示的动态数组),则需要提供设计良好的复制构造函数,确保将类对象按值传递给函数时进行深复制,创建该数组的拷贝。
问:我的类只有一个构造函数,它接受一个有默认值的参数。那这个构造函数是默认构造函数吗?
答:完全正确。只要在不提供参数的情况下创建实例,就可以认为这个类有默认构造函数。每个类都只能有一个默认构造函数。
问:在复制构造函数中,为何将指向源对象的引用作为参数?
答:这是编译器对复制构造函数的要求。其原因是,如果按值接受源对象,复制构造函数将调用自己,导致没完没了的复制循环。
以下补充几个简单的类:
只能有一个实例的单例类:
class president
{
private:
president(){};
president(const president&);
sonst president& operator=(const president&);
String name;
public:
static president& GetInstance()
{
static president OnlyInstance;
return OnlyInstance;
}
string GetName()
{
return name;
}
void SetName(string InputName)
{
name = InputName;
}
};
不允许复制的类:
class president
{
private:
president (const president&);
president& operator=(const president&);
};
禁止在栈中实例化的类:
class MonsterDB
{
private:
~MonsterDB();
};