C++ - 构造对象的两种方法

C++ 学习笔记

C++ 构造对象

简介

  • 任何 class 的 的对象都会占用空间,就算没有任何成员变量,也至少会占用 1 byte
  • 不同的构造方法会使得内存在不同的地方,显然:stack & heap
  • stack 上的对象有自动的生命周期,让程序跳出生命周期的scope,对象就会被自动释放
  • heap 上的对象只有主动删除才会被释放
  • 尽可能的创建 stack 上的对象,因为这样会更快,更好管理
  • heap 上创建对象会耗费更长的时间,而且需要手动 delete

stack 上的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <string>

class Entity
{
private:
std::string name;
public:
Entity() : name("Unknown") {}
Entity(const std::string& n) : name(n) {}

const std::string& GetName() const { return name; }
};

// 程序的主函数
int main()
{
Entity e("qinhan");
std::cout << e.GetName() << std::endl;

Entity* e1;
{
Entity test("qinhan");
e1 = &test;
// e1 的 name 是 "qinhan"
std::cout << test.GetName() << std::endl;
}

// 在这儿,e1 的 name 是空字符串
// 因为e1 指向的是 stack 上的对象,生命周期结束之后,就会被回首

return 0;
}

heap 上的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <string>

class Entity
{
private:
std::string name;
public:
Entity() : name("Unknown") {}
Entity(const std::string& n) : name(n) {}

const std::string& GetName() const { return name; }
};

// 程序的主函数
int main()
{
Entity e("qinhan");
std::cout << e.GetName() << std::endl;

Entity* e1;
{
Entity test("aaa");
e1 = &test;
// 在这儿,e 的 name 是 "qinhan"
std::cout << test.GetName() << std::endl;
}

// 在这儿,e 的 name 是空字符串
// 因为e 指向的是 stack 上的对象,生命周期结束之后,就会被回首
std::cout << e1->GetName() << std::endl;


{
Entity* test = new Entity("asdf");
e1 = test;
// 在这儿,e 的 name 是 "qinhan"
std::cout << test->GetName() << std::endl;
}

std::cout << e1->GetName() << std::endl;

delete(e1);
return 0;
}

new 关键字

  • main purpose of the word new is to allocate memory in the heap
  • 返回指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <string>

class Entity
{
private:
std::string name;
public:
Entity() : name("Unknown") {}
Entity(const std::string& n) : name(n) {}

const std::string& GetName() const { return name; }
};

// 程序的主函数
int main()
{
int a = 2;
int* b = new int;
int* c = new int[2];

Entity* e1 = new Entity;
// new 关键字其实就是申请空间,可以用一下的写法所代替呢
// 但是不同的是,上面那种写法会执行构造函数,而下面这种写法只会申请空间,并不会执行构造函数
Entity* anOtherE = (Entity*)malloc(sizeof(Entity));

Entity* e2 = new Entity("qinhan");
Entity* e3 = new Entity[50];

// 千万记得 delete
delete e1;
delete anOtherE;
delete e2;
// 注意这是删除数组的方式哦
delete[] e3;

return 0;
}