【C++】重载“<<"操作符和关键字static!!!
来源:互联网 发布:网络架构师下载 编辑:程序博客网 时间:2024/05/24 08:34
首先,重载已经在上一篇博客里面有简单的介绍,这篇博客来简单说一下重载“<<”操作符。
当我第一次想到重载“<<”操作符的时候,想法和重载其他的操作符是一样的想法,实现的代码如下:
class Date{public:void operator<<(ostream &_cout);Date(int year,int month,int day):_year(year),_month(month),_day(day){}private:int _year;int _month;int _day;};void Date::operator<<(ostream &_cout){_cout<<_year<<"-"<<_month<<"-"<<_day<<endl;}但是,这个重载调用的时候却是能这样调用:
int main(){Date today(2017,9,14);today<<cout;return 0;}虽然,这个重载完成了基本的功能,但是这样的调用不符合平时编写代码的习惯,而且在我们写代码的时候经常会用到连续的输出,显然这个函数没有达到我们想要的目的,同时在重载的内部含有换行操作,这是一个不好的设计方式,不建议在重载的内部换行。
于是,重新对重载进行了设计,
friend ostream & operator<<(ostream &_cout,Date &d){_cout<<d._year<<"-"<<d._month<<"-"<<d._day;return _cout;}当我们这样设计重载的时候就可以和习惯性的调用那样进行调用,并且这个重载友元函数还可以进行连续的调用。
static关键字的常见用法:
在c语言里面,static关键字可以修饰全局变量、函数、局部变量:
(1)、当个修饰全局变量的时候,会将全局变量存储在静态区,这样就变成了静态全局变量,作用域为整个文件的作用域(整个程序运行期间都存在),在没有显示的对静态全局变量进行初始化的时候,编译器会自动 的给我们初始化成0.
(2)、当static修饰局部变量的时候,就变成局部静态变量,作用域为局部作用域(在函数或者语句模块调用期间)。
(3)、当static修饰函数的时候、直接的改变了函数的链接属性,将函数的外部链接属性改成了局部链接属性,即普通函数可以由extern声明为外部链接属性,但是static修饰的函数只能在本文件的作用域内进行使用。
在c语言里面使用static修饰主要就是改变变量的生命周期和作用域。
在C++里面出来可以兼容c语言里面的用法同时还可以修饰成员变量和成员函数:
(1)、static修饰成员变量时候,这个变量并不占用这个对象的大小!
class Date{private:int _year;int _month;int _day;static int data;};int main(){cout<<sizeof(Date)<<endl;return 0;}这个程序的运行结果是12,但是为什么会是这样?
在用每个类创建对象的时候,static修饰的变量是创建在代码段的公共存储区,即无论用这个类创建对少个对象,任何一个对象访问这个变量都是访问的同一个位置。
那么就存在另外一个性质:无论是用类名::static变量还是对象.static变量,其结果都是一样的,他们访问的都是同一个地址。
(2)、static修饰成员函数的时候。
在每个对象调用成员函数的时候间接的使用this指针进行的,但是在static修饰的成员函数里面不存在this指针,所以在static函数里面不能调用非静态变量,而在非静态成员函数里面可以调用静态成员变量。
为什么在静态成员函数里面不可以调用非静态成员变量?
首先,每个对象调用成员函数的时候是通过this指针来实现的,但是在static成员函数里面是没有this指针的,所以在静态成员函数里面是不可以访问非静态成员变量。
为什么在非静态成员函数里面可以访问静态成员变量?
静态成员变量存储在代码段的公共存储区,在这里是每个对象都可以访问的位置,所以在非静态成员函数里面可以访问静态成员变量,并且每个对象访问的位置和值都是一样的。
- 【C++】重载“<<"操作符和关键字static!!!
- 【C++】operator关键字(重载操作符)
- C++ operator关键字(重载操作符)
- C++ operator关键字(重载操作符)
- 关于c++static关键字和extern关键字
- 面向对象(二)——操作符重载 & 关键字this & 静态成员static
- operator关键字(重载操作符)
- 类型转换和操作符重载 (c#)
- C++【操作符重载】
- c++::操作符重载
- C++:操作符重载
- c语言中的static和extern关键字
- C和C++中的static关键字小结
- C/C++中的static和extern关键字
- C和C++中的Static关键字
- c语言的static和extern关键字
- c语言中的static和extern关键字
- C/C++中Static和extern关键字
- 13. Roman to Integer
- 输入两个链表,找出它们的第一个公共结点
- SpringMVC起步-构建Web应用程序
- 岛国科普第2弹-再造人类生命的神奇细胞Human.Life.Our.Amazing.Cell
- js-时间处理
- 【C++】重载“<<"操作符和关键字static!!!
- 使用MFC实现五子棋
- 368. Largest Divisible Subset
- 有一件事我想说
- 博弈知识汇总----Tanky Woo(转)
- myeclipse js文件报错
- 中国科学院大学(国科大)未选课程加入课程网站(旁听蹭课专用!!!)
- dubbo+zookeeper安装配置
- 关于作者