指向存储整数的堆内存位置的指针 我是C++新手,对以下问题感到困惑:

指向存储整数的堆内存位置的指针 我是C++新手,对以下问题感到困惑:,c++,C++,问题: 已经声明了一个名为Pair的类,但尚未实现构造函数。Pair有两个公共成员变量: int *pa,*pb; 这两个“指向int的指针”旨在指向存储整数的堆内存位置。Pair类的其余部分需要以下功能 单个构造函数对(inta,intb):这应该设置pa和pb指向堆上新分配的内存位置。这些内存位置的整数应该根据构造函数的整数参数a和b赋值。 复制构造函数对(constpair&other):它将另一对的只读引用作为其参数。它应该将新构造的对设置为“深度副本”,也就是说,它应该根据解

问题: 已经声明了一个名为Pair的类,但尚未实现构造函数。Pair有两个公共成员变量:

    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