赞
踩
在C++中,理解对象的存储方式、生命周期以及内存管理是基础也是关键。特别是对于初学者而言,区分类的指针变量和普通变量的不同用法是非常重要的。在本文中,我们将通过一个简单的
Person
类来展示加星号(指针变量)和不加星号(普通变量)在声明和使用上的根本区别。我们使用的
Person
类包含基本的属性和方法,足以说明两种变量类型在内存分配、生命周期和使用方式上的差异。通过直接对比普通变量和指针变量的使用,可以清晰地看到它们如何影响对象的构造、存储、管理和销毁。普通变量提供了一种简洁且安全的方式来处理对象,它们的生命周期自动与其作用域绑定,无需担心内存管理的复杂性。而指针变量则提供了更大的灵活性,允许程序在运行时动态管理对象的生命周期和内存,适合于对象大小不固定或生命周期跨越多个作用域的场景。
本文将通过实际代码示例来进一步阐述这两种方式的具体应用及其优缺点,帮助读者更深刻地理解何时以及如何选择使用它们。
使用一个简单的 Person
类来说明加星号和不加星号的区别。
不加星号的例子:
- #include <iostream>
- #include <string>
-
- class Person {
- private:
- std::string name;
- int age;
-
- public:
- Person(const std::string& name, int age) : name(name), age(age) {
- std::cout << "Constructor called for " << name << std::endl;
- }
-
- ~Person() {
- std::cout << "Destructor called for " << name << std::endl;
- }
-
- void introduce() {
- std::cout << "My name is " << name << " and I'm " << age << " years old." << std::endl;
- }
- };
-
- int main() {
- Person person("Alice", 25);
- person.introduce();
-
- return 0;
- }
输出结果:
- Constructor called for Alice
- My name is Alice and I'm 25 years old.
- Destructor called for Alice
在这个例子中,Person person("Alice", 25)
声明了一个 Person
类型的对象变量 person
,并直接存储了 Person
对象的实例。对象在声明时通过构造函数进行初始化,并在作用域结束时自动调用析构函数进行清理。
加星号的例子:
- #include <iostream>
- #include <string>
-
- class Person {
- private:
- std::string name;
- int age;
-
- public:
- Person(const std::string& name, int age) : name(name), age(age) {
- std::cout << "Constructor called for " << name << std::endl;
- }
-
- ~Person() {
- std::cout << "Destructor called for " << name << std::endl;
- }
-
- void introduce() {
- std::cout << "My name is " << name << " and I'm " << age << " years old." << std::endl;
- }
- };
-
- int main() {
-
- // Person* person;
- // person = new Person("Alice", 25);
-
- Person* person = new Person("Alice", 25);
- person->introduce();
-
- delete person;
-
- return 0;
- }
输出结果:
- Constructor called for Alice
- My name is Alice and I'm 25 years old.
- Destructor called for Alice
在这个例子中,Person* person = new Person("Alice", 25)
声明了一个指向 Person
对象的指针变量 person
,并使用 new
关键字在堆上动态创建了一个 Person
对象。指针变量 person
存储了动态创建的对象的内存地址。
通过 person->introduce()
可以使用指针变量来访问和调用 Person
对象的成员函数。在使用完动态分配的对象后,需要使用 delete person
显式地释放内存,以避免内存泄漏。
这两个例子的区别在于对象的存储方式和生命周期管理。不加星号的例子直接存储对象的实例,对象的生命周期与所在的作用域相同,而加星号的例子通过指针存储对象的内存地址,可以动态创建和销毁对象,并在不同的作用域之间传递对象的引用。
我们通过一个具体的Person
类的例子,展示了两种不同的声明方式:
Person person("Alice", 25);
Person* person = new Person("Alice", 25);
new
关键字动态分配内存delete
关键字显式释放内存以避免内存泄漏结合文章
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。