C++链表中struct与对象混用的原因及测试代码逻辑解析
C++循环链表代码解析与常见疑问解答
一、完整代码逻辑解析与输出结果
先看这段完整代码:
struct Element { string name; Element* next; }; Element *e1, *e2; e1 = new Element (); e2 = new Element (); e1->name = "I am e1 "; e2->name = "I am e2 "; e1->next = e2; e2->next = e1; e1=e2; cout << e1->name << e1->next->name;
逐行拆解执行过程:
struct Element定义了一个链表节点类型,包含字符串成员name和指向同类型节点的指针next,用于构建链表结构。Element *e1, *e2;声明两个指向Element类型对象的指针,此时它们未初始化,属于野指针。e1 = new Element();和e2 = new Element();:在堆内存中分别创建两个独立的Element对象,将对象的内存地址分别赋值给e1和e2,此时e1、e2各自指向一个节点对象。e1->name = "I am e1 ";和e2->name = "I am e2 ";:为两个节点的name成员赋值。e1->next = e2;和e2->next = e1;:让两个节点的next指针互相指向对方,形成循环链表结构。e1 = e2;:将e2的地址赋值给e1,此时e1和e2指向同一个节点(原e2指向的、name为"I am e2 "的节点)。cout << e1->name << e1->next->name;:e1->name取当前指向节点的name值,即"I am e2 ";e1->next指向原e1节点(循环链表的关联关系未改变),所以e1->next->name是"I am e1 "。最终输出结果为:I am e2 I am e1
二、关于“混用struct与对象”的疑问
在C++中,struct定义的是类类型(和class几乎等价,仅默认成员权限不同:struct默认public,class默认private)。这段代码不存在“混用”问题:
struct Element是定义节点的类型模板;new Element()基于该类型创建具体的堆对象;- e1、e2是指向这些对象的指针,用于操作对象。
这是C++用结构体构建链表的标准写法,完全合理。
三、指针声明与对象创建代码解析
针对这段代码:
Element *e1, *e2; e1 = new Element (); e2 = new Element ();
Element *e1, *e2;:声明两个Element*类型的指针变量,此时它们未绑定有效内存,属于野指针,直接解引用会触发未定义行为。e1 = new Element();:调用Element的默认构造函数,在堆内存中分配符合Element类型大小的空间并创建对象,将对象地址赋值给e1,此时e1指向该堆对象。同理e2 = new Element();创建第二个独立的Element对象并让e2指向它。
内容的提问来源于stack exchange,提问作者Ponghines
相关产品推荐
相关产品推荐

