当前位置: 首页 > article >正文

C++中的构造器(Constructor)(也称为构造函数)

在C++中,构造器(Constructor)也称为构造函数,它是一种特殊的成员函数,用于在创建对象时初始化对象的数据成员。以下是关于C++构造器的详细介绍:

构造函数的特点

  1. 名称与类名相同:构造函数的名称必须与它所属的类的名称完全相同。
  2. 没有返回类型:构造函数不声明返回类型,甚至连void也不允许。
  3. 自动调用:当创建类的对象时,构造函数会被自动调用。

构造函数的分类

1. 默认构造函数

默认构造函数是一种不带任何参数的构造函数。如果类中没有显式定义任何构造函数,编译器会自动提供一个默认构造函数,这个默认构造函数不执行任何操作。一旦你定义了自己的构造函数,编译器就不会再提供默认构造函数。

示例代码

#include <iostream>

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

int main() {
    MyClass obj; // 创建对象时自动调用默认构造函数
    return 0;
}

代码解释

  • MyClass类中定义了一个默认构造函数,它会在创建MyClass对象时自动调用,并输出一条信息。
2. 带参数的构造函数

带参数的构造函数允许在创建对象时传递初始值,从而对对象的数据成员进行初始化。

示例代码

#include <iostream>

class Rectangle {
private:
    int length;
    int width;
public:
    // 带参数的构造函数
    Rectangle(int l, int w) {
        length = l;
        width = w;
        std::cout << "Parameterized constructor called" << std::endl;
    }

    int area() {
        return length * width;
    }
};

int main() {
    Rectangle rect(5, 3); // 创建对象时传递参数,调用带参数的构造函数
    std::cout << "Area of rectangle: " << rect.area() << std::endl;
    return 0;
}

代码解释

  • Rectangle类的构造函数接受两个参数lw,并将它们分别赋值给lengthwidth成员变量。
  • main函数中创建Rectangle对象时,传递了参数53,调用了带参数的构造函数。
3. 拷贝构造函数

拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类对象的副本。如果类中没有显式定义拷贝构造函数,编译器会自动提供一个浅拷贝的拷贝构造函数。

示例代码

#include <iostream>

class Point {
private:
    int x;
    int y;
public:
    Point(int a, int b) : x(a), y(b) {}

    // 拷贝构造函数
    Point(const Point& other) {
        x = other.x;
        y = other.y;
        std::cout << "Copy constructor called" << std::endl;
    }

    void print() {
        std::cout << "x: " << x << ", y: " << y << std::endl;
    }
};

int main() {
    Point p1(1, 2);
    Point p2(p1); // 调用拷贝构造函数
    p2.print();
    return 0;
}

代码解释

  • Point类的拷贝构造函数接受一个const引用的Point对象other,并将其成员变量的值复制到新对象中。
  • main函数中,通过Point p2(p1)创建了一个新对象p2,它是p1的副本,调用了拷贝构造函数。

构造函数的初始化列表

构造函数的初始化列表用于在构造函数体执行之前初始化类的数据成员。它可以提高效率,尤其是对于常量成员和引用成员。

示例代码

#include <iostream>

class Circle {
private:
    const double pi;
    double radius;
public:
    // 使用初始化列表初始化常量成员和普通成员
    Circle(double r) : pi(3.14159), radius(r) {
        std::cout << "Circle constructor called" << std::endl;
    }

    double area() {
        return pi * radius * radius;
    }
};

int main() {
    Circle c(5);
    std::cout << "Area of circle: " << c.area() << std::endl;
    return 0;
}

代码解释

  • Circle类的构造函数中,使用初始化列表pi(3.14159), radius(r)piradius进行初始化。pi是常量成员,必须在初始化列表中进行初始化。

http://www.kler.cn/a/528531.html

相关文章:

  • C#,入门教程(10)——常量、变量与命名规则的基础知识
  • 【VM】VirtualBox安装CentOS8虚拟机
  • 优盘恢复原始容量工具
  • 20个整流电路及仿真实验汇总
  • 创建 priority_queue - 进阶(内置类型)c++
  • 面向对象设计:SOLID 原则
  • 三、js笔记
  • 扬帆启航于数据结构算法之雅舟旅程,悠然漫步于C++秘境——探索线性表之栈的绮丽定义与精妙实现
  • 10.[前端开发-CSS]Day10-CSS的浮动和flex布局
  • 【LeetCode: 81. 搜索旋转排序数组 II + 二分查找】
  • 汽车中控屏HMI界面,安全和便捷是设计的两大准则。
  • 调音基础学习
  • 【LLM-agent】(task3)数据库对话Agent和RAG接入Agent
  • 【数据结构-前缀树】力扣208. 实现 Trie (前缀树)
  • Baklib揭示内容中台实施最佳实践的策略与实战经验
  • 好用的翻译工具
  • 基于VMware的ubuntu与vscode建立ssh连接
  • java练习(1)
  • 网络编程套接字(中)
  • 力扣动态规划-17【算法学习day.111】
  • 深入解析“legit”的地道用法——从俚语到正式表达:Sam Altman用来形容DeepSeek: legit invigorating(真的令人振奋)
  • 计算机网络之物理层通信基础(编码与调制)
  • java练习(2)
  • 初识ArkTS语言
  • Java小白入门教程:泛型,泛型类型参数<T> <K> <V> <E>(必须Get的知识)
  • WSL2中安装的ubuntu开启与关闭探讨