构造函数的分类及调用
两种分类方式:
- 按参数分为:有参构造和无参构造(默认构造);
- 按类型分为:普通构造和拷贝构造。
拷贝构造:传入的是另一个类的对象
三种调用方式:
- 括号法
- 显示法
- 隐式转换法
1)括号法(常用)
#include <iostream>
using namespace std;
class Person{
public:
int age;
//构造函数:没有返回值,不写void,函数名与类名相同,可以有参数
//无参构造函数
Person()
{
cout << "无参构造函数的调用" << endl;
}
//有参构造函数
Person(int a)
{
age = a;
cout << "有参构造函数的调用" << endl;
}
//拷贝构造函数
Person(const Person &p)//被拷贝的不能改变,所以使用const
{
age = p.age;//将传入的人身上所有的属性,拷贝到我身上
cout << "拷贝构造函数的调用" << endl;
}
//析构函数
~Person()
{
cout << "析构函数的调用" << endl;
}
};
//调用
void test()
{
//1、括号法
Person p1;//默认构造函数的调用,不要加(),加()编译器会认为是函数声明
Person p2(20);//有参构造函数
Person p3(p2);//拷贝构造函数
cout << "p2的年龄为:" << p2.age << endl;
cout << "p3的年龄为:" << p3.age << endl;
}
int main()
{
test();
system("pause");
return 0;
}
2) 显示法
void test()
{
//2、显示法
//下列等号右侧叫匿名对象,当前行执行结束后,系统会立即回收掉匿名对象
Person p1;//默认构造函数的调用,不要加括号,加括号编译器会认为是函数声明
Person p2 = Person(10);//有参构造函数
Person p3 = Person(p2);//拷贝构造函数
//注意事项:不要利用拷贝构造函数 初始化匿名对象
cout << "p2的年龄为:" << p2.age << endl;
cout << "p3的年龄为:" << p3.age << endl;
}
3)隐式转换法
void test()
{
//3、隐式转换法
Person p4 = 10;//相当于Person p4 = Person(10);
Person p5 = p4;//调用拷贝构造
cout << "p2的年龄为:" << p4.age << endl;
cout << "p3的年龄为:" << p5.age << endl;
}
拷贝构造函数的调用时机
C++中拷贝构造函数的调用时机通常有三种情况
- 使用一个已经创建完毕的对象来初始化一个新对象;
- 值传递的方式给函数参数传值;
- 以值方式返回局部对象。
#include <iostream>
#include <string>
using namespace std;
class Person{
public:
int m_Age;
//无参构造函数
Person()
{
cout << "默认构造函数的调用" << endl;
}
//有参构造函数
Person(int age)
{
m_Age = age;
cout << "有参构造函数的调用" << endl;
}
//拷贝构造函数
Person(const Person &p)
{
m_Age=p.m_Age;//将传入的人身上所有的属性,拷贝到我身上
cout << "拷贝构造函数的调用" << endl;
}
//析构函数
~Person()
{
cout << "析构函数的调用" << endl;
}
};
//1、使用一个已经创建完毕的对象来初始化一个新对象
void test01()
{
Person p1(10);
Person p2(p1);
}
int main()
{
test01();
system("pause");
return 0;
}
ps:25没听太明白,改天再看一遍…