20.拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于:
-
通过使用另一个同类型的对象来初始化新创建的对象。
-
复制对象把它作为参数传递给函数。
-
复制对象,并从函数返回这个对象。
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。拷贝构造函数的最常见形式如下:
classname (const classname &obj) {
// 构造函数的主体
}
例子:
#define_CRT_SECURE_NO_WARNINGS//windows系统
#include <iostream>
#include <cstdlib>
using namespace std;
struct student {
char *name;
int age;
student(char *n = "no name", int a = 0){
name = new char[100]; //分配动态的一百个字符的空间 比malloc好
strcpy (name,n); //将传进来的参数的字符串拷贝到name字符串里
age = a;
cout<<"构造函数,申请了100个char元素的动态空间"<< endl;
}
student (const student &s){ //拷贝构造函数
name = new char[100] ;// 比malloc好
strcpy (name,s.name); //把s的name指向的字符串拷贝到name里面
age = s.age;
cout <<"拷贝构造函数"<< endl;
}
student& operator=(const student &s){
name = new char[100]; // 比malloc好
strcpy(name,s.name);
age = s.age;
cout<<"赋值运算符"<< endl;
return *this; //自引用,返回自身,*是指向自身的指针
}
virtual ~student() { //析构函数
delete[] name; //不能用free
cout <<"析构函数,释放了100个char元素的动态空间"<< endl;
}
};
int main() {
student s; //s.name
student k ("John", 56); //k.name
cout<< k. name << ", age " << k.age << endl << endl;
student m(s); //调用的是拷贝构造函数:student (const student &s)
s = k; //赋值运算符 s.name=k.name 这里s和k指向的都是同一块内存
//s.operator=(k):student& operator=(const student &s)
cout << s. name << ",age " << s.age << endl << endl;
cout << k. name << ",age " << k.age << endl << endl;
cout << m. name << ",age " << m.age << endl << endl;
//delete[] k.name delete[] s.name 同一块内存不能释放两次
return 0;
}
赋值运算符:一个对象赋值给另外一个对象。
注意:有一些类不能采用编译器默认生成的拷贝构造函数和赋值运算符,而是要自己定义。