鱼C论坛

 找回密码
 立即注册
查看: 311|回复: 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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2025-2-23 10:57:12 | 显示全部楼层
你提供的代码片段只是部分内容,下面我将提供一个完整的示例来演示构造函数的使用与 explicit 关键字的作用。

构造函数与 explicit 关键字示例

  1. #include <iostream>

  2. using namespace std;

  3. class Person {
  4. public:
  5.     // 默认构造函数
  6.     Person() {
  7.         cout << "Default constructor called" << endl;
  8.     }

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

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

  18. void testFunction(Person p) {
  19.     cout << "In testFunction" << endl;
  20. }

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

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

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

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

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

  35.     return 0;
  36. }
复制代码


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


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-7 02:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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