类和对象 —— 函数的分类以及调用
类和对象 —— 函数的分类以及调用
1、函数的分类
两种分类方式:
按参数分为:有参构造和无参构造
按类型分为:普通构造和拷贝构造
2、函数的调用
(1)括号法
Person p1; //默认构造函数
Person p2(10); //有参构造函数
Person p3(p2); //拷贝构造函数
(2)显示法
Person p1;
Person p2 = Person(10);
Person p3 = Person(p2);
(3)隐式法
Person p2 = 10; //相当于Person p2 = Person(10);
Person p3 = p2;
代码演示:
#include<iostream>
using namespace std;
class Person{
public:
Person()
{
cout<<"这是一个默认的构造函数"<<endl;
}
Person(int var)
{
cout<<"这是一个有参的构造函数"<<endl;
age = var;
}
Person(const Person &p)
{
cout<<"这是一个拷贝构造函数"<<endl;
age = p.age;
}
~Person()
{
cout<<"这是一个析构函数"<<endl;
}
private:
int age;
};
void test()
{
Person p1;
Person p2(10);
Person p3(p2);
}
int main()
{
test();
return 0;
}
tips:
调用如下:
Person(10); //匿名对象 特点:当前行执行结束后,系统会立即回收掉匿名对象
cout<<"qwewqwe"<<endl;
输出如下:
这是一个有参的构造函数
这是一个析构函数
qweqwe
不要使用拷贝构造函数初始化匿名对象
示例如下:
Person(p3); //重定向错误,编译器会认为Person(p3) === Person p3;对象的声明
cout<<"123123"<<endl;
3、拷贝构造函数调用
C++中拷贝构造函数调用时机通常有三种情况:
-
使用一个已经创建完毕的对象来初始化一个新对象
-
值传递的方式给函数参数传值
-
以值方式返回局部对象
4、构造函数调用规则
默认情况下,C++编译器至少给一个类添加3个函数:
(1). 默认构造函数*(无参,函数体为空)
(2).默认析构函数(无参,函数体为空)
(3).默认拷贝构造函数,对属性进行值拷贝
构造函数调用规则如下:
- 如果用户定义有参构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造
- 如果用户定义拷贝构造函数,C++不会再提供其他构造函数
5、深拷贝与浅拷贝
浅拷贝:简单拿的赋值拷贝操作
深拷贝:在堆区重新申请空间,进行拷贝操作
浅拷贝带来的问题是堆区的内存重复释放,浅拷贝的问题利用深拷贝来解决
Tips:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

浙公网安备 33010602011771号