代码:
#include
using namespace std;
int year = 55; //全局变量
int month = 56;
int day = 57;
void Set(int y, int m,int d) //全局函数
{
year=y; //给全局变量赋值
month=m;
day=d;
}
void PPP() //全局函数
{
cout << "*****global*****" << endl;
cout << year << " " << month << " " << day << endl;
}
class TimeDate
{
public:
void Set(int y,int m,int d) //成员函数
{
year=y; //给成员变量赋值
::month=m; //给全局变量赋值
day=d;
//使用::表明是全局函数
//不使用:: 按先成员函数后全局函数的顺序查找函数
::PPP(); //使用全局函数,而不是成员函数
PPP(); //使用成员函数,而不是全局函数
}
void PPP()
{
cout << "*****local*****" << endl;
cout << year << " " << month << " " << day << endl;
}
void PPP1()
{
cout << "*****local->global*****" << endl;
cout << ::year << " " << ::month << " " << ::day << endl;
}
private:
int year; //成员变量
int month;
int day;
};
int main(int argc, const char** argv) {
TimeDate t;
cout << "origin value" << endl;
t.PPP();
t.PPP1();
PPP();
cout << "after global function Set work" << endl;
Set(1,2,3);
t.PPP();
PPP();
cout << "after member function Set work" << endl;
t.Set(4,5,6);
t.PPP();
PPP();
cout << "program end" << endl;
return 0;
}
运行结果:
origin value
*****local*****
0 16 0
*****local->global*****
55 56 57
*****global*****
55 56 57
after global function Set work
*****local*****
0 16 0
*****global*****
1 2 3
after member function Set work
*****global*****
1 5 3
*****local*****
4 16 6
*****local*****
4 16 6
*****global*****
1 5 3
program end
分析与结论:
1、全局变量与成员变量同名:全局函数默认使用的是全局变量,只有通过访问对象的成员才可以获取成员变量的值;而成员函数优先使用的是成员变量,但是可以通过在成员变量名前面加上::来显式说明这是全局变量,此时成员函数使用的就是全局变量。另外,成员函数按照先成员变量后全局变量的顺序使用变量,换句话说,也就是成员函数优先使用成员变量,若变量名在成员变量中找不到时才会去查找和使用全局变量,若全局变量里面也没有变量名,则报错。
2、全局函数与成员函数同名:在类的外面,一般情况下调用的是全局函数,只有通过访问对象的成员函数才可以使用成员函数;在类的里面,调用的是成员函数,但是可以在成员函数前面加上::来显示说明需要调用的是全局函数。另外,按照先成员函数后全局函数的顺序来调用函数,换句话说,也就是优先使用成员函数,若成员函数不存在,才会去查找和使用全局函数,若全局函数里面也没有这个函数,则报错。
堆栈不是堆栈 堆栈不是堆栈
192***0438@qq.com
2年前 (2023-09-11)