C++自动提供以下函数
- 默认构造函数
- 复制构造函数
- 赋值运算符
- 析构函数
- 地址运算符
复制构造函数和赋值运算符重载
每当程序生成了对象的副本,编译器都将调用复制构造函数。具体来说,当函数按值传递对象或者返回对象时,都将使用复制够着函数。
浅复制:默认复制构造函数,逐个复制非静态成员,复制的是成员的值。
深复制:复制构造函数应当复制字符串并将副本的地址赋给str成员。不是仅仅复制字符串的地址。这样在调用析构函数时就不会出现释放已经释放的字符串。
复制构造函数和赋值运算符重载的几个区别:
1. 复制构造函数没有返回值,赋值运算符返回对象的一个引用。
2. 复制构造函数之前对象没有分配内存,不需要delete
3.复制构造函数会增加对象的个数
StringBad::StringBad(const StringBad &st){ //对象个数 ++ len = st.len; str = new char[len + 1]; std::stcpy(str,st.str);}StringBad &StringBad::operator=(const StringBad &st){ if (this == &st) return *this; delete []str; len = st.len; str = new char [len + 1]; std::strcpy(str,st.str); return *this;}
可以这样避免编译器生成默认的构造函数和赋值运算符重载函数
class Queue{ private: Queue(const Queue &){} Queue &operator=(const Queue &){ // return *this; }}c程序员通常使用NULL而不是0来表示一个指针为空;用'\0'来指明字符串的结束,而不是0
初始化成员列表
语法:classname::func(int n,int m):mem1(n),mem2(m) {
}作用:这些初始化工作是在对象创建时完成的,此时还未执行括号中任何代码。
- 这种格式只能用于构造函数
- 必须用这个格式来初始化费静态const成员(const成员复值将编译不通过)
- 必须用这个格式来初始化一个引用数据成员
成员初始化顺序于他们出现在类中的顺序相同,于他们在初始化成员列表顺序无关。