C++之operator()和构造函数区别与总结(二百三十)

2023-09-22 11:56:58

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之operator()和构造函数区别与总结。

2.operator()和构造函数区别

在C++中,operator()和构造函数是两个不同的概念和用法。

  1. operator()

    • operator()是一个函数调用运算符(Function Call Operator),它允许我们将一个对象像函数一样进行调用。
    • 通过在类中定义名为operator()的函数,可以使对象具有函数调用的行为,从而可以像调用函数一样使用对象。
    • 运算符()通过重载,可以根据参数和返回类型的不同,实现不同的行为。
    • 通常情况下,operator()被用于函数对象(Function Object)或仿函数(Functor),它们是一种特殊的对象,可以像函数一样进行调用。
  2. 构造函数:

    • 构造函数是一种特殊的成员函数,在创建类对象时被自动调用,用于初始化对象的成员变量和执行其他必要的操作。
    • 构造函数的名称与类名相同,没有返回类型,包括默认构造函数、拷贝构造函数和其他重载的构造函数。
    • 默认构造函数用于在创建对象时不提供任何参数的情况下初始化对象。
    • 拷贝构造函数用于通过已有的对象创建一个新对象,复制已有对象的数据。

两者的区别和原理如下:

  • operator()是一个运算符,它定义了对象的函数调用行为,使对象可以像函数一样被调用。
  • 构造函数是一个特殊的成员函数,用于在创建对象时进行初始化操作。
  • operator()通常用于函数对象或仿函数,而构造函数仅在对象被创建时调用。
  • operator()可以接受参数并返回值,其行为是根据重载的不同而确定的。构造函数没有返回类型,仅用于对象的初始化。
  • operator()的语法是在类中重载operator()运算符,而构造函数的语法是在类中定义一个与类同名的函数。
  • operator()和构造函数都遵循函数调用的原理,但用途和使用方法有所不同。

3.operator()应用实例

v1.0

#include <iostream>

// 例子1:计算平方的函数对象
class Squarer {
public:
  int operator()(int x) const {
    return x * x;
  }
};

int main() {
  Squarer squarer;

  int result = squarer(5); // 调用squarer对象,相当于squarer.operator()(5)
  std::cout << "Squared value: " << result << std::endl;

  return 0;
}

v2.0

#include <iostream>
#include <string>

// 例子2:将字符串倒序输出的函数对象
class ReversePrinter {
public:
  void operator()(const std::string& str) const {
    for (int i = str.size() - 1; i >= 0; --i) {
      std::cout << str[i];
    }
    std::cout << std::endl;
  }
};

int main() {
  ReversePrinter reversePrinter;

  reversePrinter("Hello, World!"); // 调用reversePrinter对象,相当于reversePrinter.operator()("Hello, World!")

  return 0;
}

v3.0

#include <iostream>

// 例子3:计算平均值的函数对象
class AverageCalculator {
private:
  double sum;
  int count;

public:
  AverageCalculator() : sum(0), count(0) {}

  void operator()(double x) {
    sum += x;
    count++;
  }

  double getAverage() const {
    return sum / count;
  }
};

int main() {
  AverageCalculator averageCalculator;

  averageCalculator(4.5); // 调用averageCalculator对象,相当于averageCalculator.operator()(4.5)
  averageCalculator(7.3);
  averageCalculator(2.8);

  double average = averageCalculator.getAverage();
  std::cout << "Average: " << average << std::endl;

  return 0;
}

3.构造函数应用实例

v1.0 默认构造函数

#include <iostream>


class MyClass {
public:
  MyClass() {
    std::cout << "Default Constructor" << std::endl;
  }
};

int main() {
  MyClass obj; // 使用默认构造函数创建对象

  return 0;
}

v2.0 带参数的构造函数

#include <iostream>
class Point {
private:
  int x, y;

public:
  Point(int xPos, int yPos) : x(xPos), y(yPos) {
    std::cout << "Parameterized Constructor" << std::endl;
  }
};

int main() {
  Point obj(3, 4); // 使用带参数的构造函数创建对象

  return 0;
}

v3.0 拷贝构造函数

#include <iostream>

class MyString {
private:
  char* str;

public:
  MyString(const char* s) {
    // 在堆上分配内存保存字符串
    int length = strlen(s) + 1;
    str = new char[length];
    strncpy(str, s, length);
    std::cout << "Constructor" << std::endl;
  }

  MyString(const MyString& other) {
    // 深拷贝构造函数
    int length = strlen(other.str) + 1;
    str = new char[length];
    strncpy(str, other.str, length);
    std::cout << "Copy Constructor" << std::endl;
  }

  ~MyString() {
    // 销毁堆上分配的内存
    delete[] str;
    std::cout << "Destructor" << std::endl;
  }
};

int main() {
  MyString obj1("Hello"); // 使用带参数的构造函数创建对象
  MyString obj2(obj1);   // 使用拷贝构造函数创建对象

  return 0;
}
更多推荐

职业了解|03师范生的编制教师之路

“初闻不解曲中意,再闻已是曲中人”。每个行业有一个共性在于,外面的人想进去,里面的人想出来。时代变化,不同的行业的细则也在变化。十五年前,有谁会预计计算机会这么火爆呢?估计大概率只会被认为计算机属于不务正业。而现在,宇宙的尽头是编制。但编制是否真的十全十美呢?本文讲述一个小学在编教师的心声。1、为什么想到读师范生我高考

基于CNN-LSTM的时序预测MATLAB实战

一、算法原理1.1CNN原理卷积神经网络具有局部连接、权值共享和空间相关等特性。卷积神经网络结构包含卷积层、激活层和池化层。(a)二维卷积层将滑动卷积滤波器应用于输入。该层通过沿输入垂直和水平方向移动滤波器对输入进行卷积,并计算权重与输入的点积,然后加入一个偏置项。具体表达式为:卷积层的功能是对输入数据进行特征提取。其

基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM(AgriculturalProductionSystemssIMulator)模型是世界知名的作物生长模拟模型之一。APSIM模型有Classic和NextGeneration两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、

1、MongoDb综述

1.MongoDb综述1.1.什么是NosqlNoSQL:NotOnlySQL,本质也是一种数据库的技术,相对于传统数据库技术,它不会遵循一些约束,比如:sql标准、ACID属性,表结构等。Nosql优点l满足对数据库的高并发读写l对海量数据的高效存储和访问l对数据库高扩展性和高可用性l灵活的数据结构,满足数据结构不固

zabbix

zabbix是一个基于Web界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。zabbix由2部分构成,zabbixserver与可选组件zabbixagent。通过C/S模式采集数据

sqlite条件查询语句where

文章目录导入CSV数据where其他运算符sqlite初步导入CSV数据查询是数据库中最频繁的操作,但学习查询指令,最起码要有可供查询的表格。比如现在有下面这些2022排名前20的国家GDP的数据,当然格式是csv的,我们要做的第一步就是将其转为sqilte格式。1,美国,美洲,254600,0.2532042,中国,

Excel_字母数字混合排序(数字不符合预期)的一种解决方法

引ADC_DCAL_DN1[13:0]ADC_DCAL_DN10[13:0]ADC_DCAL_DN11[13:0]ADC_DCAL_DN2[13:0]ADC_DCAL_DN3[13:0]ADC1_EOCADC10_EOCADC11_EOCADC2_EOCADC3_EOCADC4_EOCADC5_EOCADC_CALCB

酷开科技夯实流量基础,构建智慧生活新风尚!

在这个日新月异的时代,智能化趋势加速发展,依托于互联网服务的OTT也越来越贴近消费者的居家生活,并在家用场景下释放出独特的大屏营销价值。成立于2006年的酷开科技,一直是智能电视行业前进道路上的坚实力量,自创建以来便一直为互联网智能电视行业提供技术与运维服务。酷开科技以内容技术服务和数字营销服务为核心,自主研发了一套智

Leetcode.213 打家劫舍 II

题目链接Leetcode.213打家劫舍IImid题目描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金

Golang 的 GMP:并发编程的艺术

前言在Golang的并发编程中,GMP是一个重要的概念,它代表了Goroutine、M(线程)和P(调度器)。这个强大的三位一体的并发模型使得Golang在处理并发任务时非常高效和灵活。通过GMP的组合,Golang实现了一种高效的并发模型。它充分利用了多核处理器的优势,并通过轻量级的Goroutine实现了高并发的编

MYSQL--事务

目录一、事物的概念:二、事务的ACID特点:1.原子性:2.一致性:3.隔离性:4.持久性:三、隔离性:1.事务之间的相互影响:(1)脏读:(2)不可重复读:(3)幻读:(4)丢失更新:2.Mysql的隔离级别:3.隔离级别作用范围:四、事务控制语句:1.commit提交事务:2.ROLLBACK回滚:3.使用回滚点:

热文推荐