电子商务网站建设php,网站内容架构,西安网站搭建,酒店用品网站建设文章目录 自定义类型和重载const关键字取地址重载#xff08;类的默认构造函数#xff09; 自定义类型和重载
在内置类型中#xff0c;和可以自动识别
在自定义类型冲#xff0c;运算符重载#xff0c;和和重载const关键字取地址重载类的默认构造函数 自定义类型和重载
在内置类型中和可以自动识别
在自定义类型冲运算符重载和也可以重载我们首先来认识一下和
//流插入 将键盘输入的内容赋值到变量中
//流提取 将cout后面的内容输出到屏幕中int main()
{int a;double b;Date date;//自定义类型输出的形式系统无法规定(自定义类型的成员变量不同)所以需要和重载cinab;//系统可以自动识别类型couta bendl;return 0;
}iostream是C中的输入输出流istream是输入流ostream是输出流这样理解即可
std::ostream::operator我们看到编译器对于内置类型进行了处理接下来以Date类为例子进行操作符重载
对于和总结
1.可以直接支持内置类型是因为库中实现了
2.可以直接支持自动识别类型是因为函数重载传入对应类型的参数就可以调用对应的函数
#define _CRT_SECURE_NO_WARNINGS
#includeiostream
using namespace std;
//Date
class Date
{
public:void operator(ostream out);//我们使用的成员函数所以默认this占用一个成员形参调用这个函数的形式为 对象名.operatorcoutDate(int year, int month, int day){_year year;_month month;_day day;}
private:int _year;int _month;int _day;
};
void Date::operator(ostream out)
{out _year _month _day endl;
}
int main()
{Date date1(2010, 10, 10);Date date2(1012, 1, 10);Date date3(2001, 10, 10);date1.operator(cout); //等同于date1cout//但是这一种明显不是我们需要的coutint 这种类型所以我们要实现的是coutdate1return 0;
}为了实现coutdate1 这样的写法我们要使得ostream形参在前面Date对象在后面但是如果是在成员函数中this对象总是占据第一个位置date1.operator(cout) 实际上就是相当于传递两个参数第一个参数是thisdate1第二个参数才是为cout所以为了解决这个问题先调用coutcout在前面我们应该使用全局函数
#define _CRT_SECURE_NO_WARNINGS
#includeiostream
using namespace std;
//Date
class Date //我们使用全局函数可以使得第一个参数为cout 从而实现coutdate1
{ //但是全局函数不在类中无法使用私有成员变量所以我们应该使用friend(在不破化原有封装性的基础上打开一个口子只是使得这个函数成为类似于共有函数可以访问d的私有成员)
public:friend ostream operator(ostream out, const Date d);//传入形参为ostream类型也就是输出流传引用那么Date(int year, int month, int day){_year year;_month month;_day day;}
private:int _year;int _month;int _day;
};
//但是我们知道 coutintint 是库里支持的所以我们应该返回ostream来实现这个功能
ostream operator(ostream out, const Date d)
{out d._year d._month d._day endl;//调用这个函数就可以输出我们规定的内容return out;
}//传引用返回
int main()
{Date date1(2010,10,10);Date date2(1012, 1, 10);Date date3(2001, 10, 10);cout date1date2date3;return 0;
}所以上面这个代码是最为符合库中对于内置类型的重载的使用ostream返回并使用全局函数来实现cout在前实例化成员在后且可以连续
和是一个道理都是istream为返回值然后使用传参先是istream in 然后再是第二个参数const Date d
//例子如下
class Date{public:friend istream operator(istream in,const Date d);private:int _year;int _month;int _day;
};istream operator(istream in,const Date d){//需要进行判断是否是合理的年月日根据自定义类型成员变量的需求进行更改//这里就不去写判断日期是否合理int year, month, day;in year month day;}
int main()
{Date d;///然后就可以实现流插入————插入进去流提取————提取出来cind;Date d1,d2,d3;cind1d2d3;return 0;
}上文就是对于流插入和流提取的运算符重载主要内容就是使用istream/ostream 引用返回使得第一个变量位置给了istream in/ostream out第二个形参位置给了自定义类型
iostream是c的标准库里面包括但不限于istream标准输入类ostream标准输出类
const关键字
const的基本用法为修饰变量或者是指针使得其不能改变数值或指向
//在C中多了一种对于const的用法
class Date{public:Date(int year,int month,int day){_yearyear;_monthmonth;_dayday;}void Print() const //使用const来修饰的是this指针 也就是 const Date* this,使得this指向的成员变量不能被改变{cout_year-_month-_dayendl;}private:int _year;int _month;int _day;
};
int main()
{return 0;
}const修饰指针的时候如const Date* this不能改变的是this的成员变量指针的指向是可以变化的
const修饰变量的时候如Date* const this不能改变的是指针的指向但是this的成员变量是可以变化的
const同时修饰指针和变量的时候如const Date* const this,指针的指向和this的成员变量都不能改变 请思考下面的几个问题 const对象可以调用非const成员函数吗非const对象可以调用const成员函数吗const成员函数内可以调用其它的非const成员函数吗非const成员函数内可以调用其它的const成员函数吗 对于上述问题我们通过下面代码测试的得到答案
1.const对象不能调用非const的成员函数
2.非const对象是可以调用非const修饰的成员函数/const修饰的成员函数
3.const成员函数内不能调用非const成员函数
4.非const成员函数内可以调用非const修饰的成员函数/const修饰的成员函数 #define _CRT_SECURE_NO_WARNINGS#includeiostreamusing namespace std;//在C中多了一种对于const的用法
class Date {
public:Date(int year, int month, int day){_year year;_month month;_day day;}void Print() const //使用const来修饰的是this指针 也就是 const Date* this,使得this指向的成员变量不能被改变{cout _year - _month - _day endl;//这是const修饰的成员函数Print2();//说明不能调用非const函数}void Print2() {Print();//说明可以调用const修饰的函数}void plus_year(){_year;}private:int _year;int _month;int _day;
};
int main()
{Date d1(1, 1, 1);const Date d2(2, 2, 2);//创建两个变量分别为非const和const修饰d1.Print();d2.Print();//调用const修饰的函数说明是可以的d1.plus_year();d2.plus_year();//const修饰的成员不能调用非const修饰的成员return 0;
}下面的对于const的一些小问题权限可以变小但是不能放大
int main()
{const int a10;int ba; //这一个是正确的因为只是将a的数值拷贝赋值给bb的改变不会影响a所以正确const int c10;int dc; //这是错误的因为d引用c使得d可以改变cc不能被改变const变量权限小于普通变量涉及到权限放大所以这是错误的const int e10;int*pfe; //错误这个和引用是类似的都是涉及到权限放大return 0;
}取地址重载类的默认构造函数
前面四个类中默认的成员函数都已经学习我们来学习一下剩下这两个取地址重载的默认成员函数
取地址重载主要就是针对普通成员和const对象取地址但是这两个会自己去实现实际上使用默认的即可
class Date{public:Date* operator() //对于普通成员{cout非constendl;return this;//取地址返回的是指针类型}Date* operator() const{coutconstendl;return this;//对于const修饰的成员}
};
int main()
{Date d1;const Date d2;Date* d3d1;const Date* d4d2;return 0;
}一般来说使用编译器默认的取地址重载即可但是对于一些特殊情况是可以使用取地址重载的比如说只是取出来这个this对象中某一成员变量的地址获取指定的内容的时候