随笔 - 1760  文章 - 0  评论 - 109  阅读 - 431万

7. 三大函数:拷贝构造函数,拷贝赋值函数, 析构函数

字符串类的例子,是侯老师自己写的,因为标准库的例子功能太复杂了。

编译器提供的拷贝赋值只是拷贝了对象的指针,没有真正拷贝对象。

1. 拷贝构造函数和拷贝赋值函数

 

2. 3个特殊函数

只要类里面带有指向某个数据类型的指针,一定需要写拷贝构造函数拷贝赋值函数。3个特殊函数(Big three):

  • 拷贝构造函数
  • 拷贝赋值函数
  • 析构函数

 

 

 3. 构造函数和析构函数

  • new就是要分配一块内存。 
  • 如果类里面含有指针,多半需要用new动态分配内存。
  • 动态内存别忘记用delete 指针变量的形式释放掉,在new所在那一行离开作用域之前。
  • 构造函数所占用的内存不是动态分配的,在离开它们所在的作用域的时候,析构函数自动被调用。
  • 在为字符串分配内存的时候,都要多分配一个字节,用来存放结束符'\0'

 string.h

复制代码
#pragma once
class String
{
public:
    String(const char* cstr=0);
    String(const String& str = 0);
    String& operator=(const String& str);
    ~String();
    char* get_cstr() const { return m_data}

private:
    char* m_data;
};

inline
String::String(const char* cstr=0)
{
    if (cstr)
    {
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data, cstr);
    }
    else
    {
        m_data = new char[1];
        *m_data = '\0';  //这里也许可以这样写:*m_data='';(网友观点)
    }
}

inline
String::~String()
{
    delete[] m_data;
}
复制代码

 

 4. 只要类里面有指针,一定需要写拷贝构造函数和拷贝赋值函数,为什么?如果用标准库提供的拷贝构造函数或者拷贝赋值函数会怎样?

答:会出错,因为这是浅拷贝,执行b=a;后,本来是想把a的字符串值赋给b,但是这样只会让b指向同一块内存(所包含的内容),还会造成这样一个后果,假如改变a,b也会跟着改变,因为它们指向相同的内容。此时b叫做a的别名(alias),在编程里面,别名的存在是一件危险的事情。

 

 5. 拷贝构造函数(深拷贝)

 

 6. 拷贝赋值函数

首先检测自我赋值,如果没有检测,会出现不好的结果。

拷贝赋值的具体步骤是:

  • 杀掉自己;
  • 开辟和赋值过来的对象一样大小的空间;
  • 字符串复制。

拷贝赋值操作语句:a=b;如果指针a和b本来就指向同一块内存空间,杀掉a之后,相当于把b指向的内容也杀掉了,所以没办法做第2步了。

第2行里面的&代表对象的引用,第4行里面的&代表取地址。

 7. 字符对象的输出----输出操作符重载

不可以写成成员函数,因为输出方向会相反。用户用的时候不方便:s1<<cout;

实际上这样用比较方便:cout<<s1;

网友1:当“<<”函数输出指向字符串的指针时,它会自动输出整个字符串,然而如果这个指针指向的是其它数据类型,则输出的指针变量的右值。

 

posted on   一杯明月  阅读(999)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示