尝试学习类和“堆”c++

Posted

技术标签:

【中文标题】尝试学习类和“堆”c++【英文标题】:Trying to learn classes and the 'heap' c++ 【发布时间】:2012-02-14 08:27:13 【问题描述】:

所以,我对下面的代码很困惑。它直接引用自 C++ for Dummies 5th ed,减去我制作的 cmets。

class student
public:
    int semesterHours;
    float gpa;
    student valFriend; //I thought to use the name of the class as a data type
    student& refFriend;
    student* ptrFriend; 
; //then this line should read .. 'student;' to enable something like the above

int main()

    student& student = *new student; //new student object 'student'
    student.gpa = 2.0;

    student& studentFriend = *new student; //new student object 'studentFriend'
    studentFriend.gpa = 4.0;

    student.valFriend = studentFriend;

    student.pFriend = &studentFriend;


在“学生”类中,这些对象本身是什么?这怎么可能呢?如果我没看错的话,是否使用新函数在堆外分配了两个新对象,其名称分别为“student”和“studentFriend”?

然后对象 student.valFriend 被赋予对象“studentFriend”的所有值。

在我看来,最后一段代码是为“学生”类的一些未声明的成员对象分配 studentFriend 的引用?也许有人可以更明确地解释这一点。一个简单的解决方法是,在文本中它可能是“student.ptrFriend”,但他们不会看到吗?也许我是那个错过了什么的人。否则,我不明白这一行的语法。

除此之外,代码甚至无法编译。这里发生了什么?我想不编译的原因可能是因为它只是关于引用和指针的部分中的一些代码。尽管如此,它仍然令人困惑。

【问题讨论】:

这真的是一本书的示例代码吗?我的第一个想法是放弃这本书并完全阅读其他内容。这个示例代码很糟糕。 我认为这只是一堆与手头主题相关的代码。从那以后它就没有做,实际上什么也没做。我只是对它使用的一些语法感到困惑。尤其是自己类定义中的 student 对象? 同意,你需要一本不同的书。甚至上网。一个好的起点可能是cplusplus.com/doc/tutorial。我认为您甚至不能将对象 student 作为学生对象的字段,因为它会无限地构造学生对象(尽管您可以有一个指针)。 student& student = *new student; 这是什么书?!?! Here are good books C++ for Dummies 第 5 版。那我会尝试一种新的方法。无论如何,我从来没有真正喜欢过这个特定的参考。谢谢! 【参考方案1】:

由于以下原因无法编译:

class student
public:
    int semesterHours;
    float gpa;
    student valFriend; // this line is full of evil!
    student& refFriend;
    student* ptrFriend;
;

想一想。一个学生可以保存一个学生的价值,可以保存一个学生的价值,可以保存一个学生的价值……你正在构建一个无限大小的对象。您不能将对象存储在自身内部。

student& student。你想命名一个变量student。但是student 已经是一个取名(它是你班级的名字)。此外,您不能更改参考。一旦你做了参考,它就固定了。因此,如果 struct/class 包含引用,则必须在构造对象时对其进行初始化:

class student
public:
    student(student& myFriend):refFriend(myFriend), ptrFriend(0)
    // if a student has no friend, we say he's his own friend:
    student():refFriend(*this), ptrFriend(0)        
    int semesterHours;
    float gpa;    
    student& refFriend;
    student* ptrFriend;
;

int main()

    student& myStudent = *(new student);   //new student object 'student'
    myStudent.gpa = 2.0;

    student& studentFriend = *new student; //new student object 'studentFriend'
    studentFriend.gpa = 4.0;    

    myStudent.ptrFriend = &studentFriend;

但是,那里发生了一些非常令人毛骨悚然的事情。为什么要分配动态内存并存储对它的引用?你打算如何解除分配?使用delete &myStudent?这在很多很多层面上都是错误的。最好使用pointer动态内存或者使用自动存储对象:

class student
public:
    student(student& myFriend):refFriend(myFriend)
    student():refFriend(*this)
    int semesterHours;
    float gpa;    
    student& refFriend;
    student* ptrFriend;
;

int main()

    student myStudent;
    myStudent.gpa = 2.0;

    student studentFriend;
    studentFriend.gpa = 4.0;

    myStudent.ptrFriend = &studentFriend;

虽然你的风格会产生有效的 C++ 代码,但我永远不会使用它,因为很难找到错误。找一本好书,了解引用、指针和动态内存。

【讨论】:

【参考方案2】:

如果这来自一本书,请寻找其他内容。用这么少的几行代码就解决了这么多的编码错误,真是一项了不起的成就;)

首先:你不能声明一个未知类的成员:

class student
public:
    // ...
    student valFriend; //<- impossible, class student is not known, yet
    student& refFriend; // impossible without initialization constructor
    // ...
;    

second:除了代码无效之外,永远不要取消引用newmalloc 检索到的指针 - 内存很可能会丢失(又名泄漏),因为您稍后忘记删除它。您可以对这个特定示例执行以下操作:

student james;
student jim;

james.ptrFriend = &jim; // stores the pointer to jim

除此之外,请查看Stack and Heap explained 和Classes explained 以获得更好的解释和深入的信息。

【讨论】:

以上是关于尝试学习类和“堆”c++的主要内容,如果未能解决你的问题,请参考以下文章

STL学习堆相关算法详解与C++编程实现(Heap)

C++学习备忘

堆与拷贝构造函数

java学习从“菜鸟”到“放弃”

小白学习C++ 教程十六C++ 中的动态内存分配

如何为调试目的学习 C++