博客总结 :
" 拷贝构造函数 " 又称为 " 赋值构造函数 " , 该类型构造函数有 4 种调用时机 ;
// 使用一个对象初始化另外一个对象
// 直接手动 调用拷贝构造函数
Student s2 = Student(s1);
// 将一个对象赋值给另外一个对象
// 自动调用拷贝构造函数
Student s2 = s1;
// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
}
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
Student s1(18, 170);
return s1;
}
C++ 语言中的 拷贝构造函数 是 C++ 类中的 特殊构造函数 ,
其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本 ;
拷贝构造函数 的 主要作用 是初始化新创建的对象 , 使其内容与原对象完全相同 ;
类的实例对象 以值的方式 传递给函数 , 不是以 指针 或 引用 的方式 ;
这种情况 是 以 类的 实例对象 值作为参数 , 与 对象值 相对的是
定义函数 void fun(Student s) , 该函数 的 形参是 Student 类型对象 ,
// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
}
如果调用该函数 , 需要拷贝实参 , 将 实参的副本值 , 也就是对象值 传递给函数形参 , 这个过程需要调用 Student 类的 拷贝构造函数 ;
该操作 全程 由 C++ 编译器完成 , 不需要 开发者 手动干预 ;
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "调用带参数构造函数" << endl;
}
Student(const Student& s)
{
m_age = s.m_age;
m_height = s.m_height;
cout << "调用拷贝构造函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
// 定义函数, 接收 Student 对象值作为参数
void fun(Student s)
{
}
int main()
{
// 调用带参数构造函数
Student s1(18, 170);
// 类对象值作为函数参数
fun(s1);
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :
调用带参数构造函数
调用拷贝构造函数
Press any key to continue . . .
函数直接返回类的实例对象 值 , 不是返回 指针 或 引用 ;
下面的代码 , 定义了函数 , 返回在函数内部创建的 Student 类实例对象 ;
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
Student s1(18, 170);
return s1;
}
由于 函数作用域结束后 , 其栈内存会被释放 , 在栈内存中的 Student 对象也会被销毁 , 因此 Student 类型的返回值需要返回一个副本 , 这个副本需要调用 拷贝构造函数 创建 ;
代码示例 :
#include "iostream"
using namespace std;
class Student
{
public:
Student(int age, int height)
{
m_age = age;
m_height = height;
cout << "调用带参数构造函数" << endl;
}
Student(const Student& s)
{
m_age = s.m_age;
m_height = s.m_height;
cout << "调用拷贝构造函数" << endl;
}
public:
int m_age; // 年龄
int m_height; // 身高
};
// 定义函数, 返回 Student 对象值作为返回值
Student fun()
{
Student s1(18, 170);
return s1;
}
int main()
{
// 类对象值作为函数返回值
fun();
// 控制台暂停 , 按任意键继续向后执行
system("pause");
return 0;
}
执行结果 :