C++读书笔记——拷贝构造函数,赋值运算符重载函数,转换构造函数(String类)

本文详细介绍了C++中自定义String类的设计方法,包括构造函数、拷贝构造函数、赋值运算符重载及运算符重载等功能,并强调了在涉及动态内存分配时显式定义这些函数的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一下是一个String

class String

{

public:

    String(const char*s=0);

    String(const String &);

    ~String();

    String &operator=(const String &);

//  String& operator=(const char *);

    String& operator+=(const String &);

//  String& operator+=(const char *);

    String operator+(const String&);

//  String operator+(const char *);

 char& operator[](int) const;

//  bool operator==(const char *) const;

    bool operator==(const String&) const;

    int size() { return Length; }

    char *Point() { return Str; }

private:

    int Length;

    char *Str;

};

 

String(const char*s=0);//转换构造函数

转换构造函数可以将char *字符串转换为String对象,当系统进行隐式转换时,C++会隐式的自动调用此转换函数。因此,在类中没有必要再对char * 类型进行运算符重载。

String A

Char * p

A+p//首先调用转化构造函数,然后调用String operator+(const String&);

 

 

String(const String &);//拷贝构造函数

String &operator=(const String &);//赋值运算符重载

拷贝构造函数用于复制一个String类,产生一个新类,新的类和原来的类数据成员完全相同;赋值运算符重载函数用于把一个类赋值给另一个类,是这两个类相等。

注意:拷贝构造函数参数必须是一个引用,如果不是一个引用,而是按值传递的话,当传递值得时候,需要对原对象进行复制,就会调用拷贝构造函数,这样会是一个递归调用,而且是一个死循环的调用。

他们的区别是拷贝构造函数用于对一个新的对象初始化,而赋值运算符重载用于对一个已经构造好初始化完成甚至使用过的对象进行修改值。赋值操作符重载比拷贝构造函数做得要多,它除了完成拷贝构造函数所完成的拷贝动态申请的内存的数据之外,还释放了被赋值对象申请的内存空间。

 

 

String a(“asdf”)

String b(a);//拷贝构造函数

String b=a//注意,这行代码并不是赋值运算符重载,而是拷贝构造函数,他和上一行代码所实现的功能完全相同。

 

String b(“sssss0”);

b=a;//这个才是赋值运算符重载,他对已初始化的对象进行重新赋值。

 

C++有一个默认的拷贝构造函数和运算符重载函数,当没有显式的定义时,编译器当需要的时候隐式调用,将所有对应的数据成员进行复制。但是,当类中含有一个指向一块内存区域的指针,比如char *p;这样会使两个类指向同一块内存区域,当一个对象析构后,另一个对象的指针变成为空指针。所以,对于涉及到动态内存分配的类,要显式的定义拷贝构造函数,运算符重载,还有析构函数。

 

 本人已经博客移至围观IT更多精彩内容请访问:围观IT

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值