为什么以下函数可以在不声明为友元或成员函数的情况下访问类成员
Why can the following function access class member without being declared as friend or member function?
头文件:
// pe10-8arr.h -- header file for a simple list class
#ifndef SIMPLEST_
#define SIMPLEST_
// program-specific declarations
const int TSIZE = 45; // size of array to hold title
struct film
{
char title[TSIZE];
int rating;
};
// general type definitions
typedef struct film Item;
const int MAXLIST = 10;
class simplist
{
private:
Item items[MAXLIST];
int count;
public:
simplist(void);
bool isempty(void);
bool isfull(void);
int itemcount();
bool additem(Item item);
void transverse( void (*pfun)(Item &item));
};
#endif
使用标题的代码:
#include "pe10-8arr.h"
simplist::simplist(void)
{
count = 0;
}
bool simplist::isempty(void)
{
return count == 0;
}
bool simplist::isfull(void)
{
return count == MAXLIST;
}
int simplist::itemcount()
{
return count;
}
bool simplist::additem(Item item)
{
if (count == MAXLIST)
return false;
else
items[count++] = item;
return true;
}
void simplist::transverse( void (*pfun)(Item &item))
{
for (int i = 0; i < count; i++)
(*pfun)(items[i]);
}
#include <iostream>
#include <cstdlib> // prototype for exit()
#include "pe10-8arr.h" // simple list class declaration
// array version
void showmovies(Item &item); // to be used by transverse()
int main(void)
{
using namespace std;
simplist movies; // creates an empty list
Item temp;
if (movies.isfull()) // invokes isfull() member function
{
cout << "No more room in list! Bye!n";
exit(1);
}
cout << "Enter first movie title:n";
while (cin.getline(temp.title,TSIZE) && temp.title[0] != ' ')
{
cout << "Enter your rating <0-10>: ";
cin >> temp.rating;
while(cin.get() != 'n')
continue;
if (movies.additem(temp) == false)
{
cout << "List already is full!n";
break;
}
if (movies.isfull())
{
cout << "You have filled the list.n";
break;
}
cout << "Enter next movie title (empty line to stop):n";
}
if (movies.isempty())
cout << "No data entered. ";
else
{
cout << "Here is the movie list:n";
movies.transverse(showmovies);
}
cout << "Bye!n";
return 0;
}
void showmovies(Item &item)
{
std::cout << "Movie: " << item.title << " Rating: "
<< item.rating << std::endl;
}
上面的代码刚刚编译并成功运行。有人能告诉我为什么函数showmovies()
可以使用引用访问simplist
的项成员,而不被声明为友元函数或成员函数吗?
结构成员的默认可见性为public
。该函数只使用Item
,而不使用simplist
。
showMovies
采用一个Item
作为参数。它不在乎自己是否是会员。
Item
是struct
,除非另有声明,否则其字段为public
。
函数被传递了一个Item
对象(通过引用),它不知道或不关心它来自哪里。函数的调用方实际上是从完整对象内部拉取对象的调用方,但transverse
作为类的成员具有访问权限。
内部simplelist:
void simplist::transverse( void (*pfun)(Item &item))
{
for (int i = 0; i < count; i++)
(*pfun)(items[i]);
}
您正在从transversal(simplest的成员)调用showmovies,因此无论可见性如何,都可以访问所有类属性。
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法