构造函数的定义(分类)及构造函数的引用问题
构造函数的作用就是在创建类对象后,就执行构造函数
你自己不定义,编译器会帮你定义,不过函数体为空,不执行任何操作,只是涮一遍
两种分类方式: 按参数分为: 有参构造和无参构造; 按类型分为: 普通构造和拷贝构造
调用构造函数时,可以通过三种方法: 括号法、 显示法、 隐式转换法
具体可以看下面的程序,每一行都标有注释
#include <iostream>
#include<string>
using namespace std;
class Person {
public:
//无参(默认)构造函数
Person() {//如果是编译器默认构造参数,就没有cout那一行,只是一个空函数体
cout << "无参构造函数!" << endl;
}
//有参构造函数
Person(int a) {
age = a;//可以认为是set部分,在执行构造函数的时候,完成了可写操作
cout << "有参构造函数!" << endl;
}
//拷贝构造函数
Person(const Person& p) {//接收另一个同类,认为本类型的一个引用变量
age = p.age;//这个p可以看作是p2,age认为是p3的成员属性定义
cout << "拷贝构造函数!" << endl;
}
//析构函数
~Person() {//更改了编译器默认的析构函数,所以,不论哪种拷贝构造函数,释放的时候均走这个析构函数
cout << "析构函数!" << endl;
}
public:
int age;
};
//2、构造函数的调用
//调用无参构造函数
void test01() {
Person p; //创建了一个类对象,然后调用无参构造函数
}
//调用有参的构造函数
void test02() {
//2.1 括号法,常用
Person p1(10);//一定要有参数,不然也不是无参构造调用,也不能成为有参构造调用,四不像
//注意1:调用无参构造函数不能加括号,如果加了编译器认为这是一个函数声明
//Person p2();
//2.2 显式法
Person p2 = Person(10);//等号左边是Person类的一个定义,然后执行有参构造
Person p3 = Person(p2);//等号左边是Person类的一个定义,然后执行有参构造,但这个参是同类变量,所以就叫拷贝构造
//Person(10)单独写就是匿名对象 当前行结束之后,马上析构
//注意2:不能利用 拷贝构造函数 初始化匿名对象 编译器认为是对象声明
//Person p5(p4);你把匿名对象中的参数给变成了同类,那不行。
//2.3 隐式转换法
Person p4 = 10; // Person p4 = Person(10);
Person p5 = p4; // Person p5 = Person(p4);
}
int main() {
test01();
//test02();
system("pause");
return 0;
}
//有参构造函数,可以认为是减少一个设置函数,也就是public下的接口,暂时认为。