分类方式

  1. 按参数分: 有参构造(默认构造) & 无参构造

  2. 按类型分: 普通构造 & 拷贝构造


调用方式

括号法

  • 语法:

    1
    2
    3
    1. 类名 对象名
    2. 类名 对象名(参数)
    3. 类名 对象名(引用别名)
  • 示例:

    1
    2
    3
    4
    5
    6
    int main() {
    Person p1;//默认构造函数调用
    Person p2(10);//有参构造函数
    Person p3(p2);//拷贝构造函数
    return 0;
    }
  • 运行结果:

    1
    2
    3
    4
    5
    6
    Person的无参构造函数
    Person的有参构造函数
    Person的拷贝构造函数
    Person的析构函数
    Person的析构函数
    Person的析构函数
    注意: 调用默认构造函数时,不要加"()"。因为编译器会认为是函数的声明,不会认为在创建函数

显示法

  • 语法:

    1
    2
    3
    1. 类名 对象名;
    2. 类名 对象名 = 类名(参数);
    3. 类名 对象名 = (引用别名);
  • 示例:

    1
    2
    3
    4
    5
    6
    int main() {
    Person p1;//默认构造函数调用
    Person p2 = Person(10);//有参构造函数
    Person p3 = Person(p2);//拷贝构造函数
    return 0;
    }
  • 运行结果:

    1
    2
    3
    4
    5
    6
    Person的无参构造函数
    Person的有参构造函数
    Person的拷贝构造函数
    Person的析构函数
    Person的析构函数
    Person的析构函数
    注意: 不要用拷贝构造函数,初始化匿名对象,编译器会认为Person (p3)等价于Person p3;(在显示法调用示例中)
补充: 显式调用法示例中"Person(10)"为匿名对象,当执行结束后,系统会立即回收

隐式转换法

  • 语法

    1
    2
    1. 类名 对象名 = 参数;
    2. 类名 对象名 = 引用别名;
  • 示例:

    1
    2
    3
    4
    5
    int main() {
    Person p1 = 10;//有参构造函数
    Person p2 = p1;//拷贝构造函数
    return 0;
    }
  • 运行结果

    1
    2
    3
    4
    Person的有参构造函数
    Person的拷贝构造函数
    Person的析构函数
    Person的析构函数
    解释: 隐式转换法实例中 "Person p1 = 10;"相当于"Person p1 = Person (10);"

  • 上方所有代码均以此代码为基础

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Person {
public:
//无参构造函数
Person() {
std::cout << "Person的无参构造函数" << std::endl;
}
//有参构造函数
Person(int age) {
std::cout << "Person的有参构造函数" << std::endl;
}
//拷贝构造函数
Person(const Person& p) {
std::cout << "Person的拷贝构造函数" << std::endl;
age = p.age;
}
//析构函数
~Person() {
std::cout << "Person的析构函数" << std::endl;
}

int age;//定义成员属性
};