类和对象 —— 函数的分类以及调用

类和对象 —— 函数的分类以及调用

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:如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝带来的问题

posted @ 2022-03-01 22:42  W_K_L  阅读(389)  评论(0)    收藏  举报