我刚刚开始学习C ++,并且遇到了以下代码the doc。
// A C++ program to demonstrate common Binary Heap Operations
#include<iostream>
#include<climits>
using namespace std;
// Prototype of a utility function to swap two integers
void swap(int *x, int *y);
// A class for Min Heap
class MinHeap
{
int *harr; // pointer to array of elements in heap
int capacity; // maximum possible size of min heap
int heap_size; // Current number of elements in min heap
public:
// Constructor
MinHeap(int capacity);
// to heapify a subtree with the root at given index
void MinHeapify(int );
int parent(int i) { return (i-1)/2; }
// to get index of left child of node at index i
int left(int i) { return (2*i + 1); }
// to get index of right child of node at index i
int right(int i) { return (2*i + 2); }
// to extract the root which is the minimum element
int extractMin();
// Decreases key value of key at index i to new_val
void decreaseKey(int i, int new_val);
// Returns the minimum key (key at root) from min heap
int getMin() { return harr[0]; }
// Deletes a key stored at index i
void deleteKey(int i);
// Inserts a new key 'k'
void insertKey(int k);
};
// Constructor: Builds a heap from a given array a[] of given size
MinHeap::MinHeap(int cap)
{
heap_size = 0;
capacity = cap;
harr = new int[cap];
}
我的疑问是,为什么同一类有两个构造函数?
public:
// Constructor
MinHeap(int capacity);
和
// Constructor: Builds a heap from a given array a[] of given size
MinHeap::MinHeap(int cap)
{
heap_size = 0;
capacity = cap;
harr = new int[cap];
}
是否有特定原因为什么要以这种特定方式编写代码,而不是像这样一开始就创建一个单独的构造函数:
public:
// Constructor
MinHeap(int capacity, int* harr, int heap_size);
此外,在原始代码末尾使用的构造函数是否是另一种具有特定用途的构造函数的“类型”?
有人还可以详细解释以下代码行吗?
MinHeap::MinHeap(int cap){}
答案 0 :(得分:2)
我的疑问是,为什么同一类有两个构造函数?
这里只有一个 构造函数。
一个是声明,另一个是定义。请注意,构造函数的定义/实现是如何放置在类之外的。这就是为什么作者使用作用域解析运算符,并在其前面加上类的名称(MinHeap::
)。
是否有特定原因为什么要以这种特定方式编写代码,而不是像这样一开始就创建单个构造函数?
如上所述,该代码中只有一个构造函数。您提到的构造函数是一个不同的构造函数,带有一个新的原型,即构造函数的重载。
此外,在原始代码末尾使用的构造函数是否是另一种具有特定用途的构造函数的“类型”?
这只是构造函数的实现,如第一个答案所述。
有人还能详细说明以下行是做什么的:
MinHeap::MinHeap(int cap){}
?
上面发布的代码中没有这样的代码。无论如何,这将是名为MinHeap
的类的构造函数的实现,该类接受一个类型为int
的参数cap
,并且不执行任何操作(其主体为空)
请注意,这是一个实现(具有主体)。此外,它在类MinHeap
之外定义。可以将其放在头文件或源文件中。
重要的是要了解此构造函数是一个实现,而这是
MinHeap(int cap);
只是一个定义(请注意没有主体)。