转换函数和运算符类
我们以下是采用内联函数来进行的
#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的前置形式
共同学习,有问题请指出,谢谢