类与对象 第二部分第四小节:构造函数的调用规则

        

前置参数

using namespace std;
class person {
public:
	person()//创建无参构造函数
	{
		cout << "构造函数调用" << endl;
	}

	person(int age) {
		cout << "有参构造函数的调用" << endl;
		m_age = age;
	}
	person(const person& p)
	{
		cout << "拷贝函数的调用" << endl;
		m_age = p.m_age;
	}
	~person()//创建析构函数
	{
		cout << "析构函数的调用" << endl;
	}
	int m_age;

	//3. 以值方式返回局部对象
};

一.默认情况下,C++编译器至少给一个类添加3个函数

1.默认构造函数无参,函数体为空

2.默认析构函数无参,函数体为空

3.默认拷贝构造函数,对属性进行拷贝

void test02()
{
	person p1 = 10;
	person p2(p1);
	cout << "年龄为" << p2.m_age << endl;
}


int main() {
	test02();
	system("pause");
	return 0;
}

类与对象 第二部分第四小节:构造函数的调用规则_第1张图片

当我们注释掉前置对象中的拷贝构造函数后,系统会自动帮我们创建拷贝构造函数,并传入数值。

类与对象 第二部分第四小节:构造函数的调用规则_第2张图片

最后得到的结果不会改变太多

类与对象 第二部分第四小节:构造函数的调用规则_第3张图片

二.构造函数调用规则

(一)如果用户定义有参数构造函数,C++不再提供默认无参构造,但是会提供默认拷贝构造

1.我们将创建的无参构造函数和拷贝构造函数注释掉或删掉

#include 
using namespace std;

class person {
public:
    person(int age) {
        cout << "有参构造函数调用" << endl;
        m_age = age;
    }
    
    // 用户没有定义无参构造函数
    
    // 用户没有定义拷贝构造函数

    ~person() {
        cout << "析构函数调用" << endl;
    }
    
    int m_age; 
};

int main() {
    person p1(10); // 调用有参构造函数
    person p2 = p1; // 调用默认生成的拷贝构造函数
    return 0;
}

输出结果将是

有参构造函数调用
有参构造函数调用
析构函数调用
析构函数调用

(二)如果用户定义拷贝构造函数,C++不会再提供其它构造函数

需要用户自己定义其余构造函数,否则会报错

#include 
using namespace std;
class person {
public:
	/*person()//创建无参构造函数
	{
		cout << "构造函数调用" << endl;
	}*/

	/*person(int age) {
		cout << "有参构造函数的调用" << endl;
		m_age = age;
	}*/
	person(const person& p)
	{
		cout << "拷贝函数的调用" << endl;
		m_age = p.m_age;
	}
	/*~person()//创建析构函数
	{
		cout << "析构函数的调用" << endl;
	}*/
	int m_age;

	//3. 以值方式返回局部对象
};
/*person test01()
{
	person p1;
	cout << (int*)&p1 << endl;
	return p1;
}*/

void test02()
{
	person p1;
	person p2(p1);
	cout << "年龄为" << p2.m_age << endl;
}


int main() {
	test02();
	system("pause");
	return 0;
}

类与对象 第二部分第四小节:构造函数的调用规则_第4张图片

你可能感兴趣的:(c++,程序人生,开发语言)