一、特殊成员函数
c++特殊成员函数包含:默认构造函数、默认析构函数、复制构造函数、赋值运算符、地址运算符
1.默认构造函数
如果没有提供任何构造函数,c++将创建默认构造函数。假设创建一个student类,没有为student类创建构造函数,编译器会自动提供下面所示构造函数
Student::Student() { }
//编译器提供了一个无参数,不执行任何操作的构造函数,因为创建对象时,必会调用构造函数。
//在初始化时,我们可以显示的创建构造函数,用来初始化一些值
Student::Student(){age = 18;}
2.复制构造函数
复制构造函数用于将一个对象复制到新创建的对象中。
Student(const Student &)//将一个类对象的常量引用作为参数
2-1:调用复制构造函数时机
//新建一个对象并初始化为现有的类对象时,调用复制构造函数
//下列情况都会调用复制构造函数
Student st1(st2);//calls Student(const Student &)
Student st1 = st2;//calls Student(const Student &)
Student st1 = Student(st2);//calls Student(const Student &)
Student * st1 = new Student(st2);//calls Student(const Student &)
//*每当程序生成副本时都将调用复制构造函数,或者当函数按值传递对象或返回对象时,都会调用复制构造函数。
//按值传递意味着创建一个原始变量的副本,编译器生成临时对象时,也会调用复制构造函数
注:由于值传递创建对象将调用复制构造函数,因此按引用传递对象,可以节省调用构造函数的时间和存储新对象的空间。
2-2:默认复制构造函数功能
默认的复制构造1函数会逐个复制非静态成员(成员复制,也称为浅复制),复制的是成员的值。
//显示复制构造函数模板
Student::Student(const Student & s)
{
}
3.复制运算符
c++之所以允许类对象赋值,这是通过自动类重载赋值运算符实现的,原型如下
Class_name & Class_name::operator=(const Class_name &);
3-1赋值运算符的功能及使用时机
使用时机:将已有的对象赋给另一个对象时,将使用重载的赋值运算符
3-2定义赋值运算符函数时机
1>由于目标对象可能引用了以前分配的数据,所以函数应使用delete[]来释放这些数据
2>函数避免将对象赋给自身,因为给对象赋值前可能删除之前对象的内容
3>函数返回一个指向调用对象的引用
例子:
Student st1 = stt2 = st3;
//上述代码调用了 st1.operator=(st2.operator=(st3));
/**********************************
**赋值运算符模板
***********************************/
Student & Student::operator=(const Student & st)
{
if(this == &st)//检查排除自我复制
return *this;
delete [] str; //删除旧数据
len = st.len;
str = new char [len+1];
std::strcpy(str,st.str);//复制参数的对象的值到目标对象
return *this;
}