转换函数和运算符类

news2024/11/28 18:38:09

我们以下是采用内联函数来进行的

#ifndef ___Class_Counter
#if 1
#endif  ___Class_counter
#include <climits>
class Counter{
    unsigned cnt;
//    unsigned mmm;
public:
    Counter() : cnt(0) {}//构造函数初始化器
    //Counter(double mmm):mmm(2){}
    /*void increment() {
        if (cnt < UINT_MAX)
        {
            cnt++;
        };
    }*/
    /*Counter operator++() {
        Counter x = *this;
        ++(*this);
        return x;
    }*/
    Counter& operator++() {
        if (cnt < UINT_MAX) cnt++;
        return *this;
    }
    //operator double() const { return mmm; }

    void depressment() {
        if (cnt > 0) cnt--;
    }
    unsigned value() {
        return cnt;
    }

};
#endif 
 //上边是类
#include<iostream>
using namespace std;
int main()
{
    Counter x;
    int no;
    cout << "当前的数是:" << x.value() << endl;
    cin >> no;
    for (int i = 0; i < no; i++) {
        //x.increment(); //因为递增的时候点这个
        x.operator++();
    }
    cout << "现在的数是:" << x.value() << endl;
//    cout << "现在的数是:" << x.operator double<< endl;
    return 0;
}

遇到的问题1:

#ifndef ___Class_Counter
#if 1
#endif ___Class_counter
#endif //的做用

收获:

在c语言中,对同一个变量或者函数进行多次声明是不会报错的。所以如果h文件里只是进行了声明工作,即使不使用# ifndef宏定义,多个c文件包含同一个h文件也不会报错。
 但是在c++语言中,#ifdef的作用域只是在单个文件中。所以如果h文件里定义了全局变量,即使采用#ifdef宏定义,多个c文件包含同一个h文件还是会出现全局变量重定义的错误。
使用#ifndef可以避免下面这种错误:如果在h文件中定义了全局变量,一个c文件包含同一个h文件多次,如果不加#ifndef宏定义,会出现变量重复定义的错误;如果加了#ifndef,则不会出现这种错误。

就是说头文件的多次声明中,对于c不会报错但是对于c++是会报错的,所以为了避免出现重复定义的错误发生要使用#ifndef 和 #endif 就是防止一个源文件(.cpp)多次包含一个头文件(.h)

这里要引入#if的注释

#if 0
   a = x;
#endif //的使用其实也是一个判断语句,和if差不多,但是是预处理指令

Q2:Counter() : cnt(0) {}//构造函数初始化器 ?

因为后续c++使用{}来统一 然后并出了:std::initializer_list<>l来定义初始化数值

想详细的了解 构造函数初始化器

class X
{
private:
    int a[4];
public:
    X(): a{1,2,3,4} {//具体的实现逻辑} //C++11, 初始化数组成员  
    }
};

Q3:转换函数的使用:

转换函数的函数名是: operator Type (可以转换int double string等类型,举例如下)

class Fraction
{
public:
    Fraction(int numerator, int denominator = 1)
        :m_numerator(numerator), m_denominator(denominator)
    {
    }
    //转换函数
    operator double() const
    {
        return (double)m_numerator / m_denominator;
    }
 
private:
    int m_numerator;        //分子
    int m_denominator;      //分母
};
 
int main()
{
    Fraction f(3,5);
    double sum = 4 + f;
    std::cout << "sum = " << sum << std::endl;   //sum = 4.6
    return 0;
}
 Fraction(int numerator, int denominator = 1)
        :m_numerator(numerator), m_denominator(denominator)
    {
    }
    //转换函数
    operator double() const
    {
        return (double)m_numerator / m_denominator;
    }

其实这里和上一发个问题是一样的的就是来进行初始化(函数构造初始化2行) 然后来执行operator double()因为在return的数据都是在main函数所传入的,所以直接得到一个输出的值引入 C++的转换函数


运算符函数的运用

#ifndef ___Class_Counter
#if 1
#endif  ___Class_counter
#include <climits>
class Counter {
    unsigned cnt;
    //    unsigned mmm;
public:
    Counter() : cnt(0) {}//构造函数初始化器
    operator unsigned() const { return cnt; }
    bool operator!() const { return cnt == 1; }//判断初始值

    Counter& operator++()  //前置增
    {
        if (cnt < UINT_MAX)
            cnt++;
        return *this;

    }
    Counter operator++(int) {
        Counter x = *this;
        if (cnt < UINT_MAX) cnt++;
        return *this;
    }
    Counter& operator--() {
        if (cnt > 0) cnt--;
        return *this;
    }
    Counter operator--(int) {
        Counter x = *this;
        --(*this);
        return x;
    }
};
#endif

#include<iostream>
using namespace std;
int main()
{
    int no;
    Counter x;
    Counter y;
    cout << "向上计数次数:";
    cin >> no;
    for (int i = 0; i < no; i++) {
        cout << x++ << ' ' << ++y << '\n';

        //x.increment(); //因为递增的时候点这个
        //x.operator++();
    }

    cout << "向下计数次数:";
    cin >> no;
    for (int i = 0; i < no; i++) {
        cout << x-- << ' ' << --y << '\n';

        //x.increment(); //因为递增的时候点这个
        //x.operator++();
    }
    if (!x)
        cout << "x为0.\n";
    else
        cout << "x不为0.\n";
    //cout << "现在的数是:" << x.value() << endl;
//    cout << "现在的数是:" << x.operator double<< endl;
    return 0;
}

Q1:this ?

:其实是C++的关键字也是const的指针,但是指向当前对象而言

  • this 只能用在类的内部,通过 this 可以访问类的所有成员,包括 private、protected、public 属性的。

  • 注意,this 是一个指针,要用->来访问成员变量或成员函数。

   Counter operator++(int) {
        Counter x = *this;
        if (cnt < UINT_MAX) cnt++;
        return *this;
    }

比如这个而言,返回值是*this不就是x,然后进行数值的输出

但是如果这样呢

那么求区分前置和后置运算符的区别

:在可以区分前置形式的函数不接受参数,则 x++和++x一样

但是不能区分前后置函数时候,则最好使用++x的前置形式

共同学习,有问题请指出,谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/166442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码平台助力汽车行业构筑新基建

编者按&#xff1a;本文分析了汽车行业数字化转型的需求&#xff0c;并列举了汽车行业利用低代码平台数字化转型的场景&#xff0c;最后通过华晨汽车案例展示了低代码在实现业务模板集成方面的表现。关键词&#xff1a;数据集成&#xff0c;低代码平台&#xff0c;汽车行业汽车…

后台生成4位图像验证码

主要依赖&#xff1a; <dependency><groupId>com.github.penggle</groupId><artifactId>kaptcha</artifactId><version>2.3.2</version> </dependency>spring相关依赖参照用到的另行添加。 package com.math.controller;impor…

质心标准差和分散程度

( A, B )---1*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有1个节点&#xff0c;AB各由9张二值化的图片组成&#xff0c;在前述的实验中得到了A全是0&#xff0c;B中有3个1的迭代次数数据。 0 1 2 3 4 5 6 7 8 迭代次数 A-B 1b 1b 1b 0 0 0 0 0 0 54269.648 …

Java 日志框架 JUL

文章目录日志文件的重要性常见日志框架什么是JULJUL架构介绍入门案例JUL日志级别Logger之间的父子关系日志的配置文件日志原理解析日志文件的重要性 做开发最怕的就是线上系统出问题了&#xff0c;轻则留下产品和系统不安全可靠的不好印象&#xff0c;重则影响到公司的收入和口…

②【Spring】一文精通:IOC - 基于XML方式管理Bean

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ IOC操作&#xff1a;基于XML管理Bean一、&…

智公网:公务员行测基础考点

一、法律常识 1. 行政主体要“三有”&#xff0c;一有“权”&#xff08;行政权力&#xff09;&#xff0c;二有“名”&#xff08;以自己名义从事行政管理&#xff09;&#xff0c;三有“责”&#xff08;独立承担行政责任&#xff09;。 2. 受委托的组织和个人不具备行政主…

【自学Python】Python查找字符串

Python查找字符串 Python查找字符串教程 在开发过程中&#xff0c;很多时候我们有在一个 字符串 中查找另一个字符串的需求&#xff0c;在 Python 中&#xff0c;在一个字符串中查找另一个字符串我们使用 find() 函数。 Python find()函数详解 语法 S.find(sub[, start[, …

基于2D Object Detection的目标几何中心三维位置估计(C++)

文章目录 介绍前置知识三维位置估计订阅内参订阅对齐后的深度图并进行后处理源码介绍 这篇博客将简单讲解下如何利用二维目标检测方法和RGBD数据来获取感兴趣目标的几何中心三位位置结果。 前置知识 为了让博客内容显得简洁些,这里不再介绍前置知识,包括: 2D Object Dete…

selenium通过cookie跳过登录验证码实现登录

一般做ui自动化面对验证码一直是一个问题&#xff0c;在网上页百度了一些关于验证码的问题&#xff0c;有通过把验证码提取下来通过pytesser&#xff0c;tesseract&#xff0c;OCR 等库处理&#xff0c;但是这些比较麻烦。 还是因为本人比较渣看不懂&#xff0c;后来想到了weba…

selenium页面元素定位、操作

1 打开 / 关闭浏览器2 打开URL链接3 定位单个页面元素3.1 通过ID定位3.2 通过name定位3.3 通过classname定位3.4 通过CSS定位3.5 通过链接的文本信息定位3.6 通过XPath定位3.6.1 xpath语法3.6.2 实例4 操作4.1 基本操作4.2 切换窗口、框架5 封装selenium的基本操作6 判断元素是…

Express做后端服务详细步骤,从零到一

文章目录一、全局安装脚手架二、生成项目1.生成项目2.目录结构介绍3.拓展&#xff1a;配置文件热更新&#xff08;避免改一次文件重启一次服务&#xff09;步骤1&#xff1a;安装nodemon步骤2&#xff1a;创建nodemon.json文件步骤3&#xff1a;更改启动命令步骤4&#xff1a;上…

如何准确测试相位噪声

相位噪声是表征CW信号频谱纯度的非常重要的参数&#xff0c;衡量了信号频率的短期稳定度。通常所说的相噪为单边带(SSB) 相位噪声&#xff0c;相噪的好坏对于系统的性能至关重要&#xff01; 对于终端通信而言&#xff0c;如果接收机LO的相噪较差&#xff0c;且在信道附近存在…

GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记

文章目录一.GO语言应用场景1.1 前言1.2 什么是GO语言1.3 仅仅10行完成高并发的服务器二.入门2.1 基础语法-HelloWorld2.2 基础语法-变量类型2.2.1 变量2.2.2 if else2.2.3 循环2.2.4 switch2.2.5 数组2.2.6 切片2.2.7 map2.2.8 range2.2.9 函数2.2.10 指针2.2.11 结构体2.2.12 …

Java基础之《netty(24)—netty入站与出站机制》

一、基本说明 1、netty的组件设计&#xff1a;netty的主要组件有Channel、EventLoop、ChannelFuture、ChannelHandler、ChannelPipe等。 2、ChannelHandler充当了处理入站和出站数据的应用程序逻辑的容器。 例如&#xff0c;实现ChannelInboundHandler接口&#xff08;或Chan…

开关电源详解

目录 电源分类 线性稳压电源&#xff08;LDO&#xff09; 适用场景 特点 基本组成 开关电源 适用场景 发展方向 特点 分类 基本组成&#xff1a; 开关电源和线性电源对比&#xff1a; 两款开关电源的性能参数对比&#xff1a; 某款电源适配器&#xff1a; 电源分类…

Python NumPy 拆分数组

前言NumPy&#xff08;Numerical Python的缩写&#xff09;是一个开源的Python科学计算库。使用NumPy&#xff0c;就可以很自然地使用数组和矩阵。NumPy包含很多实用的数学函数&#xff0c;涵盖线性代数运算、傅里叶变换和随机数生成等功能。本文主要介绍Python NumPy 拆分数组…

2-求和(蓝桥杯)

问题描述给定 nn 个整数 a_1, a_2, , a_na1,a2,⋅⋅⋅,an &#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a;Sa_{1} \cdot a_{2}a_{1} \cdot a_{3}\cdotsa_{1} \cdot a_{n}a_{2} \cdot a_{3}\cdotsa_{n-2} \cdot a_{n-1}a_{n-2} \cdot a_{n}a_{n-1} \cdot a_…

2022考研人年度总结,描摹23实习备战进行时

今年&#xff0c;是硝烟弥漫的一年在各个科目上努力也常常焦虑不断怀疑是否真的可以在考研的道路上每一件努力的小事看起来无所谓但却十分有必要2022考研热词是“努力” “披星戴月”“痛苦”你的每一个清晨与深夜都刻满了泪水与汗水春天你最爱期待夏天&#xff0c;夏天你说秋天…

JAVA开发运维(CI/CD)

CI :持续性集成CD&#xff1a;持续性部署SIT&#xff1a;系统集成测试UAT&#xff1a;用户验收测试研发流程的变化&#xff0c;因为用户永远一开始不知道自己想要什么样的东西&#xff0c;导致了软件无法从一而终的进行设计&#xff0c;用户需要能立刻运行的软件和功能。&#…

再学C语言36:指针和数组

指针提供了一种用来使用地址的符号方法&#xff0c;可以很有效地处理数组 数组标记实际上是一种变相使用指针的形式 数组名同时也是该数组首元素的地址&#xff0c;如果arr是一个数组&#xff0c;则&#xff1a; arr &arr[0]; 在C中&#xff0c;对一个指针加1的结果是…