~May~ 发表于 5 天前

构造函数的使用与explicit关键字

本帖最后由 ~May~ 于 2025-2-23 11:09 编辑

#include <iostream>

using namespace std;

// 构造函数的定义:
//                1、构造函数没有返回值类型,不能写,连void都不能写
//                2、构造函数的名字必须与类名相同
//                3、构造函数可以通过不同的参数,来实现重载(Overlord)

// explicit:
//                是用来修饰构造函数的,写在构造函数之前。表示无法通过隐式调用来访问这个构造函数


// 注意事项:
//                1、如果我们没有在一个类中写任何的构造函数,系统会为其添加一个public权限的无参构造函数,可以让我们创建对象
//                2、如果我们给一个类写了构造函数,此时系统不会再提供任何默认的构造函数
// 如果我们为了一个类写了有参的构造函数,一般会同时写无参的构造函数

class Person {
public:
        Person() {
                cout << "Person类的无参构造函数执行了" << endl;
        }
        explicit Person(int age) {
                cout << "Person类的有参构造函数执行了" << endl;
        }
        Person(int age,int score) {
                cout << "Person(int,int)构造函数执行了" << endl;
        }

};

int main() {
        // 构造函数的调用:创建对象的时候调用的
        // 1.显示调用
        Person xiaoming = Person();
        // Person xiaoming = Person(10);
        // Person xiaoming = Person(10, 20);

        // Person xiaoming;//如果使用缩写的方式来调用无参的构造函数,创建对象,不能写小括号,否则系统将会认定为是在定义函数
        // Person xiaoming(10);
        // Person xiaoming(10, 20);

        // 2.隐式调用,不需要我们自己写Person(),直接将所有的参数写道一对大括号中,此时系统会根据大括号中的实参类型与数量去匹配对应的构造函数
        // Person xiaoming = {};
        // Person xiaoming = 10;//大括号中若只有一个参数,可以省略大括号// 添加了explicit关键字后,无法隐式调用
        // Person xiaoming = { 10,20 };

        // 如果使用new的方式进行创建对象,调用的是无参的构造函数可以不写小括号
        // 使用new的方法,在堆上创建对象,这个过程称为实例化
        // Person* xiaoming = new Person;

        return 0;
}

FishC 发表于 5 天前

你提供的代码片段只是部分内容,下面我将提供一个完整的示例来演示构造函数的使用与 explicit 关键字的作用。

构造函数与 explicit 关键字示例

#include <iostream>

using namespace std;

class Person {
public:
    // 默认构造函数
    Person() {
      cout << "Default constructor called" << endl;
    }

    // 带参数的构造函数
    explicit Person(int age) {
      cout << "Parameterized constructor called with age: " << age << endl;
    }

    // 带参数的构造函数 (重载)
    Person(string name) {
      cout << "Parameterized constructor called with name: " << name << endl;
    }
};

void testFunction(Person p) {
    cout << "In testFunction" << endl;
}

int main() {
    // 调用默认构造函数
    Person p1;

    // 调用带参数的构造函数
    Person p2(25);

    // 调用重载的带参数构造函数
    Person p3("Alice");

    // 通过构造函数初始化对象
    Person p4 = 30; // Error: 因为构造函数是explicit

    // 正确使用:需要显式调用
    Person p5 = Person(30);
   
    // 使用测试函数
    testFunction(p5);

    return 0;
}

解释:

[*] 默认构造函数:无参数的构造函数。
[*] 带参数的构造函数:explicit 关键字修饰,表示不能通过隐式转换来调用。
[*] 重载构造函数:多个带参数的构造函数。
[*] 在 main 函数中展示了如何正确地使用这些构造函数。


希望这能帮助你理解构造函数和 explicit 关键字的使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 构造函数的使用与explicit关键字