一个C++空类包含的东西

本文深入探讨C++中空类的概念及其隐含的成员函数,包括默认构造函数、拷贝构造函数、析构函数及重载赋值操作符。通过具体实例,解析如何正确实现拷贝构造函数以避免内存错误,特别是当类包含动态分配的指针成员时。

一个空类含有的函数:

​

class Empty{
	
}; 
//  等价于
class Empty{
	public:
		Empty(){                           //默认构造函数
			
		}
		Empty(const Empty& rhs){           //拷贝构造函数
			
		}
		~Empty(){                          //析构函数
			 
		}
		Empty& operator=(const Empty rhs){ //重载赋值操作符函数
			
		}
        Empty* operator & ();                      // 取址运算符
    
        const Empty* operator & () const;       // 取址运算符const


};

​

这些函数只有在被调用的时候才会被编译器创建出来。

Empty e1;                   // 默认构造函数

Empty e2(e1);               // 拷贝构造函数
e2 = e1;                    //重载赋值操作符

拷贝构造函数和重载赋值操作符函数用于将来源对象的每一个非静态成员变量拷贝到目标对象。

如果类中含有指针型的数据成员、需要使用动态内存,程序员最好显式定义自己的复制构造函数,避免各种可能出现的内存错误。

默认的拷贝构造函数是浅拷贝,可能导致两个指针指向了堆里的同一个空间,在销毁对象时,两个对象的析构函数将对同一个内存空间释放两次,从而引发错误。

对于对象中动态成员,就不能简单赋值,而应该重新动态分配空间。

class Rect{
    public:
        Rect()      // 构造函数,p指向堆中分配的一空间
        {
            p = new int(100);
        }
        Rect(const Rect& r)
        {
            width = r.width;
            height = r.height;
            p = new int;    // 为新对象重新动态分配空间
            *p = *(r.p);
        }
        ~Rect()     // 析构函数,释放动态分配的空间
        {
            if(p != NULL)
            {
                delete p;
            }
        }
    private:
        int width;
        int height;
        int *p;     // 一指针成员
};

参考链接:
https://www.cnblogs.com/chusiyong/p/11295171.html

https://blog.youkuaiyun.com/lwbeyond/article/details/6202256

### 如何用C++类实现单链表 以下是基于提供的引用以及专业知识构建的一个完整的单链表示例,展示如何使用C++中的类来实现这一数据结构。 #### 类定义 首先,在`.h`文件中定义单链表的节点结构和操作接口: ```cpp #pragma once #include <iostream> using namespace std; // 定义节点结构体 typedef struct Node { int data; // 节点存储的数据 struct Node* next; // 指向下一个节点的指针 } Node; class LinkedList { public: // 构造函数 LinkedList(); // 析构函数 ~LinkedList(); // 获取链表长度 int getSize() const; // 判断链表是否为空 bool isEmpty() const; // 尾部插入元素 void append(int value); // 头部插入元素 void prepend(int value); // 删除第一个匹配的元素 bool remove(int value); // 查找某个值是否存在 bool contains(int value) const; // 清空整个链表 void clear(); // 遍历打印链表内容 void display() const; private: Node* head; // 表头指针 }; ``` 上述代码展示了单链表的核心功能[^1]。它包括基本的操作方法如追加、前置插入、删除特定值等,并提供了辅助工具用于调试或验证链表状态。 #### 成员函数实现 接着是在`.txt`或其他适当位置完成这些成员函数的具体逻辑: ```cpp #include "linkedList.h" // 初始化链表对象时设置head为NULL LinkedList::LinkedList() : head(nullptr) {} // 销毁链表实例前释放所有分配内存 LinkedList::~LinkedList() { this->clear(); } int LinkedList::getSize() const { int count = 0; Node* current = head; while (current != nullptr) { ++count; current = current->next; } return count; } bool LinkedList::isEmpty() const { return head == nullptr; } void LinkedList::append(int value) { Node* newNode = new Node{value, nullptr}; // 创建新节点 if (!this->head) { // 如果当前列表为空,则直接赋给头部 this->head = newNode; } else { Node* temp = this->head; while (temp && temp->next) { // 寻找到最后一个节点 temp = temp->next; } temp->next = newNode; // 连接新的节点到末尾 } } void LinkedList::prepend(int value) { Node* newNode = new Node{value, this->head}; // 新建节点并将原首节点作为其下一节点 this->head = newNode; // 更新头部指针至新建节点 } bool LinkedList::remove(int value) { if (!this->head) return false; // 若列表已空则无法移除任何东西 if (this->head->data == value) { // 特殊情况处理——当要删除的是首个元素 Node* oldHead = this->head; this->head = this->head->next; delete oldHead; return true; } Node* prev = this->head; while (prev->next && prev->next->data != value) { prev = prev->next; } if (prev->next) { // 找到了待删除项 Node* toDelete = prev->next; prev->next = prev->next->next; delete toDelete; return true; } return false; // 未发现目标值 } bool LinkedList::contains(int value) const { Node* current = this->head; while (current) { if (current->data == value) return true; current = current->next; } return false; } void LinkedList::clear() { while (this->head) { Node* tmp = this->head; this->head = this->head->next; delete tmp; } } void LinkedList::display() const { Node* current = this->head; cout << "[ "; while (current) { cout << current->data << " "; current = current->next; } cout << "]" << endl; } ``` 此部分实现了之前声明的功能细节[^2]。特别注意析构器内的清理过程以防止资源泄漏问题发生。 --- ### 性能分析与优势说明 采用面向对象编程方式可以更好地管理复杂度较高的程序组件。对于像单链表这样基础却重要的数据结构来说,将其封装成独立可重用单元非常有价值。此外,借助于模板技术还可以进一步提升通用性[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值