第6章静态友元与运算符重载
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int Date::count=0;
Date::Date(int y,int m,int d) {
count++; year=y; month=m; day=d; }
void Date::print()const{
cout<<year<<'-'
<<month<<'-'
<<day<<'\n';
}
void Date::showCount(){
int Date::count=0;
Date::Date(int y,int m,int d) {
count++;
Date d2(2007,2,12); Date::showCount(d2); }
year=y; month=m; day=d;
当前日期个数:2个
}
参数传入的日期:2007-2-12
2.友 元
cout<<"参数传入的日期:";
void print() const ;
rd.print();
};
}
//file Date.cpp
//file Main.cpp
#include "Date.h"
#include "Date.h" // 静态数据成员初始化
void main(){ Date d1(2007,1,12);
友元函数
首先,它是一般的函数,而不是类的成员函数; 其次,在类的定义中,用friend关键字将它说明 为类的友元(在私有段和公有段都可),这样它被 允许可访问该类的所有对象的私有成员。
void Date::showCount(Date& rd)
int year, month, day;
{
static int count; public:
static void showCount(Date& rd); Date(int y,int m,int d);
cout<<"当前日期个数:" <<count<<"个\n";
静态成员函数:不与特定的对象关联,为所有类的对象共享。
静态数据成员:也为类的所有对象共享,所以在静态成员函数的实现中,可 以直接引用静态数据成员。如:
void Date::showCount(){ cout<<“当前日期个数:”<<count<<“个\n”; // 访问静态数据
}
无法直接操作非静态数据成员: 原因:静态成员函数无this指针。无this指针导致编译程序无法确定静态成 员函数中操作的非静态数据成员到底属于哪个对象。所以不能直接操作。 举例:
void Date::print() const {
cout<<year<<'-' <<month<<'-' <<day<<'\n';
}
等价于
void Date::print() const {
cout<<this->year<<'-' <<this->month<<'-' <<this->day<<'\n';
int year, month, day; static int count; public: static void showCount(); Date(int y,int m,int d); void print() const ; }; #endif
//file Date.cpp #include "Date.h" // 静态数据成员初始化
第6章静态友元与运算 符重载
静态成员函数
当一个成员函数被说明为static时,它是静态成员函数。 静态成员函数不与特定的对象关联,为所有类的对象共享。 调用静态成员函数的格式如下:
<对象名>.<静态成员函数名>(<参数表>) 或
<类名>::<静态成员函数名>(<参数表>)
//file Date.h #ifndef DATE_H #define DATE_H #include<iostream> using namespace std; class Date{
}
void main(){
year 2007
Date d1(2007,1,12);
Date d2(2007,2,12);
month 1
d1.print(); //把对象d1的地址传递给this指针 d2.print(); //把对象d2的地址传递给this指针
day
12
}
对象d1
2007 2 12
对象d2
//file Date.h
void Date::print()const{
#ifndef DATE_H
cout<<year<<'-'
#define DATE_H
<<month<<'-'
#include<iostream>
<<daபைடு நூலகம்<<'\n';
using namespace std;
}
class Date{
void Date::showCount(){ cout<<“当前日期个数:”<<count<<“个\n”; // 访问静态数据 cout<<year<<endl;//访问非静态数据
} 解决方法:在定义静态成员函数时,设置一个对象形参,调用静态成员函数 时将相应的对象传递给静态成员函数。当然也可以在函数中新定义对象。
// 访问静态私有成员
cout<<"当前日期个数:"
<<count<<"个\n";
}
//file Main.cpp
#include "Date.h"
当前日期个数:2个 当前日期个数:2个
void main(){
Date d1(2007,1,12);
Date d2(2007,2,12);
// 可行,但非标准
d1.showCount();
// 标准 静态成员函数调用
Date::showCount();
}
一般成员函数与静态成员函数的区别:
一般成员函数:主要用来对类对象的数据成员进行操作。
每个类的对象有自己的数据成员,但类中的成员函数只有一份,因此调用 成员函数时必须指明是对那个类对象操作。
确定类对象:通过一个叫 this指针的隐含参数来完成的。
一个类的私有数据和函数只能在类的作用域中使用,程序 中的对象是无法直接访问一个类中的私有成员的。 类的这种封装性使得对数据的访问提供了安全性,同时也 带来了某些不便。 因此,需要寻求一种途径,使得类以外的对象和函数能够 直接访问类中的私有成员。 在C++中,友元便是实现这个要求的一个辅助手段。 友元可以是一个函数,该函数称为友元函数;也可以是一 个类,该类称为友元类。
Date::Date(int y,int m,int d) {
count++; year=y; month=m; day=d; }
void Date::print()const{
cout<<year<<'-'
<<month<<'-'
<<day<<'\n';
}
void Date::showCount(){
int Date::count=0;
Date::Date(int y,int m,int d) {
count++;
Date d2(2007,2,12); Date::showCount(d2); }
year=y; month=m; day=d;
当前日期个数:2个
}
参数传入的日期:2007-2-12
2.友 元
cout<<"参数传入的日期:";
void print() const ;
rd.print();
};
}
//file Date.cpp
//file Main.cpp
#include "Date.h"
#include "Date.h" // 静态数据成员初始化
void main(){ Date d1(2007,1,12);
友元函数
首先,它是一般的函数,而不是类的成员函数; 其次,在类的定义中,用friend关键字将它说明 为类的友元(在私有段和公有段都可),这样它被 允许可访问该类的所有对象的私有成员。
void Date::showCount(Date& rd)
int year, month, day;
{
static int count; public:
static void showCount(Date& rd); Date(int y,int m,int d);
cout<<"当前日期个数:" <<count<<"个\n";
静态成员函数:不与特定的对象关联,为所有类的对象共享。
静态数据成员:也为类的所有对象共享,所以在静态成员函数的实现中,可 以直接引用静态数据成员。如:
void Date::showCount(){ cout<<“当前日期个数:”<<count<<“个\n”; // 访问静态数据
}
无法直接操作非静态数据成员: 原因:静态成员函数无this指针。无this指针导致编译程序无法确定静态成 员函数中操作的非静态数据成员到底属于哪个对象。所以不能直接操作。 举例:
void Date::print() const {
cout<<year<<'-' <<month<<'-' <<day<<'\n';
}
等价于
void Date::print() const {
cout<<this->year<<'-' <<this->month<<'-' <<this->day<<'\n';
int year, month, day; static int count; public: static void showCount(); Date(int y,int m,int d); void print() const ; }; #endif
//file Date.cpp #include "Date.h" // 静态数据成员初始化
第6章静态友元与运算 符重载
静态成员函数
当一个成员函数被说明为static时,它是静态成员函数。 静态成员函数不与特定的对象关联,为所有类的对象共享。 调用静态成员函数的格式如下:
<对象名>.<静态成员函数名>(<参数表>) 或
<类名>::<静态成员函数名>(<参数表>)
//file Date.h #ifndef DATE_H #define DATE_H #include<iostream> using namespace std; class Date{
}
void main(){
year 2007
Date d1(2007,1,12);
Date d2(2007,2,12);
month 1
d1.print(); //把对象d1的地址传递给this指针 d2.print(); //把对象d2的地址传递给this指针
day
12
}
对象d1
2007 2 12
对象d2
//file Date.h
void Date::print()const{
#ifndef DATE_H
cout<<year<<'-'
#define DATE_H
<<month<<'-'
#include<iostream>
<<daபைடு நூலகம்<<'\n';
using namespace std;
}
class Date{
void Date::showCount(){ cout<<“当前日期个数:”<<count<<“个\n”; // 访问静态数据 cout<<year<<endl;//访问非静态数据
} 解决方法:在定义静态成员函数时,设置一个对象形参,调用静态成员函数 时将相应的对象传递给静态成员函数。当然也可以在函数中新定义对象。
// 访问静态私有成员
cout<<"当前日期个数:"
<<count<<"个\n";
}
//file Main.cpp
#include "Date.h"
当前日期个数:2个 当前日期个数:2个
void main(){
Date d1(2007,1,12);
Date d2(2007,2,12);
// 可行,但非标准
d1.showCount();
// 标准 静态成员函数调用
Date::showCount();
}
一般成员函数与静态成员函数的区别:
一般成员函数:主要用来对类对象的数据成员进行操作。
每个类的对象有自己的数据成员,但类中的成员函数只有一份,因此调用 成员函数时必须指明是对那个类对象操作。
确定类对象:通过一个叫 this指针的隐含参数来完成的。
一个类的私有数据和函数只能在类的作用域中使用,程序 中的对象是无法直接访问一个类中的私有成员的。 类的这种封装性使得对数据的访问提供了安全性,同时也 带来了某些不便。 因此,需要寻求一种途径,使得类以外的对象和函数能够 直接访问类中的私有成员。 在C++中,友元便是实现这个要求的一个辅助手段。 友元可以是一个函数,该函数称为友元函数;也可以是一 个类,该类称为友元类。