可以从局部函数调用类的私有函数吗
Can a private function of a class be called from a local function?
简化代码以表达概念:
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
的成员,或者声明它是classA
的friend
,那么这将起作用。
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();
}
main
的返回类型应为intobject
的作用域仅在main
中,不能在somefunction
中访问,out将其显式传递给函数
在您的编辑:
您正在按值传递object
到somefunction(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
传递object
到somefunction()
时,您还应该仔细考虑自己在做什么。您正在按值传递object
,因此您正在创建一个作用域为somefunction()
的object
的副本,一旦somefunction()
终止,该副本就会被销毁。这就是你想要的吗?
我怀疑您打算通过引用将object
从main
传递到somefunction()
,在这种情况下,您需要将somefunction()
声明为
void somefunction(classA &object)
seta(int x)
是ClassA
的私有成员,因此只有ClassA
或ClassA
的friend class
才能访问此成员。CCD_ 46不是其中之一。
- 局部变量保留函数中的值
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 函数局部静态变量:从性能角度来看的优点/缺点
- 是否可以影响 C++ 中回调函数的局部变量?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 调用一个小函数两次(例如在if条件和主体中)比将结果存储在局部变量中更可取
- C++ - 指向函数中局部变量的指针
- 如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用此关键字)?
- 为什么堆栈中的函数局部变量之间存在内存空间
- 函数局部静态变量是否阻止函数内联?
- 函数局部静态变量是否自动引发分支?
- 返回函数局部变量作为引用
- 为什么这些函数局部静态对象的销毁顺序不是与初始化顺序相反?
- 函数局部变量在函数调用之间保持不变
- 是否可以在C++11之前创建函数局部闭包
- 对静态函数局部变量的引用