C++中,类(class)是核心概念之一。对类的实例化(instantiate),就是创建类的实例(亦即对象object)。
下面地代码定义了一个类Entity:
//define a class 定义类
class Entity
{
private:
string m_Name; //类的成员变量,保存名字的字符串
public:
//default constructor 类的默认构造函数,对象被冠名“unknown”
Entity() :m_Name("unknown") { };
//constructor with parameters类的带参构造函数,对象被冠以字符串name所存储的名。
Entity(const string& name) :m_Name(name) { };
const String& Get_Name() const //get reference of m_Name, 返回对象名的成员函数
{
return m_Name;
}
}; //分号结尾
创建对象有两种方法,一种是创建在栈上(stack),另一种是创建在堆上(heap)。stack和heap都是计算机的内存的一部分,栈的容量通常很小,但是运行速度极快;而堆很大,运行(performance)相对栈而言较慢。
大量的对象,适合创建在堆上,少量的对象则适合创建在栈上。两者的区别如下:
1、对象创建在栈上: 容量小,运行速度快。对象的生命周期(life span)随着程序模块域(scope)的结束而自动结束(比如一对大括号之间的代码,为一个scope),对象所占用的内存自动释放。
示例:下面的代码在栈上创建了三个对象,对象的生命周期在域内。
{
Entity entity1("apple"); //调用带构造函数
std::cout << entity1.Get_Name() << std::endl; //直接用对象引用其成员函数
Entity entity2("monkey");
std::cout << entity2.Get_Name() << std::endl;
Entity entity3; //调用默认造函数
std::cout << entity3.Get_Name() << std::endl;
}
2、对象创建在堆上: 容量大,运行速度相对较慢。对象的生命周期(life span)不随着程序模块域(scope)的结束而自动地(automatically)结束,对象占用的内存在scope之外仍然存在,需要手工释放。在堆上创建对象用关键字 new,手动摧毁对象并释放内存用关键字 delete。
Entity* e;
{
//insantiate an object on heap 在这个域内创建了一个堆上的对象,并返回对象的指针
Entity* entity4 = new Entity("laptop"); //用new创建一个对象,并返回对象的指针
std::cout << entity4->Get_Name() << std::endl; //用对象的指针引用成员函数
e = entity4; //将对象的指针,保存给域外的指针变量。该作用域结束后,对象仍然存在,不会自动销毁。
}
delete e; //free heap memory 在域外摧毁对象,并手动释放堆上内存。
【结语】
本文阐述了创建对象的两种方法,对比了各自优缺点,并用C++代码举例说明。