鱼C论坛

 找回密码
 立即注册
查看: 182|回复: 1

[技术交流] 构造函数的使用与explicit关键字

[复制链接]
发表于 2025-2-23 10:57:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ~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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-2-23 10:57:12 | 显示全部楼层
你提供的代码片段只是部分内容,下面我将提供一个完整的示例来演示构造函数的使用与 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-3-31 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表