创建C++实例的步骤是什么?

发表时间: 2023-12-07 10:36

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++代码举例说明。