指向存储整数的堆内存位置的指针 我是C++新手,对以下问题感到困惑:
问题: 已经声明了一个名为Pair的类,但尚未实现构造函数。Pair有两个公共成员变量:指向存储整数的堆内存位置的指针 我是C++新手,对以下问题感到困惑:,c++,C++,问题: 已经声明了一个名为Pair的类,但尚未实现构造函数。Pair有两个公共成员变量: int *pa,*pb; 这两个“指向int的指针”旨在指向存储整数的堆内存位置。Pair类的其余部分需要以下功能 单个构造函数对(inta,intb):这应该设置pa和pb指向堆上新分配的内存位置。这些内存位置的整数应该根据构造函数的整数参数a和b赋值。 复制构造函数对(constpair&other):它将另一对的只读引用作为其参数。它应该将新构造的对设置为“深度副本”,也就是说,它应该根据解
int *pa,*pb;
这两个“指向int的指针”旨在指向存储整数的堆内存位置。Pair类的其余部分需要以下功能
单个构造函数对(inta,intb):这应该设置pa和pb指向堆上新分配的内存位置。这些内存位置的整数应该根据构造函数的整数参数a和b赋值。
复制构造函数对(constpair&other):它将另一对的只读引用作为其参数。它应该将新构造的对设置为“深度副本”,也就是说,它应该根据解引用的值创建一个与另一对等效的新对,但不重用任何相同的内存位置。换句话说,复制构造函数应该设置自己实例的成员变量pa和pb,以指向堆上新分配的整数内存位置;这些内存位置必须是新的,而不是另一对指向的相同位置,但这些新位置的整数应根据另一对指向的整数赋值。
一个析构函数~Pair(),它取消分配以前分配给该对成员的所有堆内存。
这些成员函数的类型已在Pair声明中声明。现在您需要提供这三个成员函数中每一个的实现
(注意:下面代码注释中显示的函数声明不包括参数的参数名称。它们仅显示参数的类型。声明允许这样做,但在定义这些函数的实现时,应为参数指定名称,以便引用它们。)
答复:
/* Class Pair has already been declared
* as shown in the following comments:
*
* class Pair {
* public:
* int *pa,*pb;
* Pair(int, int);
* Pair(const Pair &);
* ~Pair();
* };
*
* Implement its member functions below.
*/
Pair::Pair(int a, int b){
pa = new int;
pb = new int;
*pa = a;
*pb = b;
}
Pair::Pair(const Pair & obj) {
pa = new int;
*pa = *(obj.pa);
pb = new int;
*pb = *(obj.pb);
}
Pair::~Pair() {
delete pa;
delete pb;
}
/* Here is a main() function you can use
* to check your implementation of the
* class Pair member functions.
*/
int main() {
Pair p(15,16);
std::cout << "first finished"<< std::endl;
Pair q(p);
std::cout << "second finished"<< std::endl;
Pair *hp = new Pair(23,42);
std::cout << "third finished"<< std::endl;
delete hp;
std::cout << "If this message is printed,"
<< " at least the program hasn't crashed yet!\n"
<< "But you may want to print other diagnostic messages too." << std::endl;
return 0;
}
但据我理解,应该是:
int *pa = new int;
int *pb = new int;
我对此感到非常困惑。有人能帮我吗?谢谢你的帮助
类对
已经声明了类型为int*
的两个成员变量pa
和pb
。构造函数的要点是为它们提供初始值
在构造函数的函数体(或任何非静态类成员函数)的范围内,可以通过名称直接访问这些成员变量。如果您使用pa
,它基本上与this->pa
相同。换句话说,它正在访问当前对象的pa
成员,该对象的类型为Pair
但是,如果您实际提供了类型定义,则会更改其含义。这些现在是新的局部变量,它们覆盖了隐式名称,否则这些名称将引用对象的成员
// These names are local variables
int *pa = new int;
int *pb = new int;
上述问题是双重的。首先,您没有初始化类成员。其次,您将泄漏内存,因为当这些变量超出范围(当函数返回时),您将无法再访问这些指针值,因此无法删除它们。
类对
已经声明了两个成员变量pa
和pb
,类型为int*
。构造函数的要点是为它们提供初始值
在构造函数的函数体(或任何非静态类成员函数)的范围内,可以通过名称直接访问这些成员变量。如果您使用pa
,它基本上与this->pa
相同。换句话说,它正在访问当前对象的pa
成员,该对象的类型为Pair
但是,如果您实际提供了类型定义,则会更改其含义。这些现在是新的局部变量,它们覆盖了隐式名称,否则这些名称将引用对象的成员
// These names are local variables
int *pa = new int;
int *pb = new int;
上述问题是双重的。首先,您没有初始化类成员。其次,您将泄漏内存,因为当这些变量超出范围时(当函数返回时),您将无法再访问这些指针值,因此无法删除它们。Unrelated:要完成
对
还应具有赋值运算符。Unrelated:对::对(int a,int b)
也可以实现为Pair::Pair(inta,intb):pa(新的int(a)),pb(新的int(b)){}
。这就利用了。在这种情况下,它没有多大作用,但是当类变得更复杂时,成员初始值设定项列表将多次节省您的时间。尽早学习是件好事。不相关的:要完成Pair
还应该有一个赋值操作符。不相关的:Pair::Pair(inta,intb)
也可以实现为Pair::Pair(inta,intb):pa(new int(a)),pb(new int(b)){}
。这就利用了。在这种情况下,它没有多大作用,但是当类变得更复杂时,成员初始值设定项列表将多次节省您的时间。尽早学习是件好事。第三,您使用了原始指针而不是智能指针,如std::unique\u ptr
。第三,您使用了原始指针而不是智能指针,如std::unique\u ptr
。