一下是一个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;这样会使两个类指向同一块内存区域,当一个对象析构后,另一个对象的指针变成为空指针。所以,对于涉及到动态内存分配的类,要显式的定义拷贝构造函数,运算符重载,还有析构函数。