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

转换函数和运算符类

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

#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的前置形式

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

相关文章:

  • 【8】SCI易中期刊推荐——图像处理领域(中科院4区)
  • 聊聊模板方法模式?
  • 【学习】计算机系统硬件和数据结构
  • Vue3+Element-Plus 实现点击左侧菜单时显示不同内容组件展示在Main区域功能
  • Vuejs设计与实现11-编译优化与同构渲染
  • SAP 服务器参数文件详细解析
  • 【C语言】自定义类型
  • 【手写 Vue2.x 源码】第二十六篇 - 数组依赖收集的实现
  • 无服务器架构Serverless
  • 我的2022
  • java springboot 项目构建报错解决办法
  • Laravel文档阅读笔记-How to Build a Rest API with Laravel: A Beginners Guide①
  • M320、M601、HD1(RTU)功能对比
  • 使用Anaconda(3-5.1.0对应 python3.6.3)搭建OpenCV(3.5.1.15)环境和Jupyter Notebook
  • 系统分析师案例必备知识点汇总---2023系列文章三
  • Retrofit源码分析实践(一)【从使用入手分析源码】
  • mysql快速生成100W条测试数据(8)全球各城市人口及经济增长速度并存入mysql数据库
  • Python数学建模问题总结(3)数据可视化Cookbook指南·下
  • [319]. 灯泡开关
  • 阿维塔冲击年10万台订单,第二款车型Q2发布