可以从局部函数调用类的私有函数吗

Can a private function of a class be called from a local function?

本文关键字:函数 局部 函数调用      更新时间:2023-10-16

简化代码以表达概念:

class classA
{
public:
private:
   int a;
   seta(int x);
};
//local prototype
void somefunction();
int main()
{
  classA object; //create an object of the class
  somefunction(object);
  return 0;
}
void somefunction(classA &object)
{
  object.seta(5);    
}

}

如果我将seta()移动到类的公共部分,则没有错误,并且它会执行。

然而,如果我将seta()移动到私有部分,我会得到以下错误:

错误C2248:'anonymous-namespace'::classA::seta' : cannot access private member declared in class '匿名命名空间'::classA'

如果函数是私有的,并且只有这个类在调用它,为什么会出现问题?

EDIT我正在将对象从main传递到本地函数

调用seta()的函数不是classA的一部分,因此这是一个错误;这就是private的定义。如果您要使somefunction()成为classA的成员,或者声明它是classAfriend,那么这将起作用。

函数somefunction()不是classA的成员函数。它是一个具有全局作用域的函数,不能访问私有函数seta(),就像main()不能访问私有功能seta()一样。

这与"本地函数"(其他函数中定义的函数(无关。这只是关于公共和私人成员。

如果一个成员是private,则该类的其他成员或该类的显式好友只能访问该成员。

private意味着只有成员函数和朋友才能访问它。两者都必须列在类声明中,但不是:

class classA
{
public:
private:
   int a;
   seta(int x);
};

在同一个文件中并不会使函数成为类的一部分——只有类声明用于确定什么可以访问。

Private成员只能由其成员和好友访问。此外,C++中的每个成员函数都应该有一个返回类型。话虽如此-

void main() // 1
{
  classA object; //2
  somefunction();
}
  1. main的返回类型应为int
  2. object的作用域仅在main中,不能在somefunction中访问,out将其显式传递给函数

在您的编辑:

您正在按值传递objectsomefunction(classA)。因此,将object(主作用域(的副本复制到somefunction作用域的object。虽然他们有相同的名字,但都不同。

void somefunction(classA object)
{                    // ^^^^^^   Is a copy of the parameter passed. 
   object.seta(5); // This call isn't actually modifying the original parameter passed.
}// life time of argument,object, ends here. 

若要修改传递的参数本身,则应改为通过引用传递。

首先,回答您的主要问题:

如果函数是私有的,并且只有这个类在调用它,为什么是有问题吗?

问题是private类成员只能由该类的其他成员调用。函数CCD_ 27不是CCD_ 28的成员,因此不能访问私有成员CCD_。

顺便说一句,当从main传递objectsomefunction()时,您还应该仔细考虑自己在做什么。您正在按值传递object,因此您正在创建一个作用域为somefunction()object的副本,一旦somefunction()终止,该副本就会被销毁。这就是你想要的吗?

我怀疑您打算通过引用将objectmain传递到somefunction(),在这种情况下,您需要将somefunction()声明为

void somefunction(classA &object)

seta(int x)ClassA的私有成员,因此只有ClassAClassAfriend class才能访问此成员。CCD_ 46不是其中之一。