转换函数和运算符类
创始人
2024-05-12 18:39:46
0

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

#ifndef ___Class_Counter
#if 1
#endif  ___Class_counter
#include 
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
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 0a = 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.6return 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 
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
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";elsecout << "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的前置形式

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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...