C++ 在C++;?

C++ 在C++;?,c++,C++,我对编程相当陌生,对于什么时候应该让函数成为类的成员函数或者仅仅使用成员getter函数访问类的私有成员感到困惑。我想两种方式都可以 考虑以下几点: #include <iostream> #include <string> using namespace std; class Person { string name; int age; public: Person() : name("James"), age(30) {}; void

我对编程相当陌生,对于什么时候应该让函数成为类的成员函数或者仅仅使用成员getter函数访问类的私有成员感到困惑。我想两种方式都可以

考虑以下几点:

#include <iostream>
#include <string>
using namespace std;

class Person
{  
  string name;
  int age;
public:
  Person()
    : name("James"), age(30)
  {};
  void Print();
  string GetName(Person& person) { return name;};
  int GetAge(Person&) { return age;};
};

void Person::Print() // member function
{
 cout << "Using member function: " << name << ", " << age << endl;
}

void Print(Person& person) // non-member function 
{
 cout << "Using non-member function: " << person.GetName(person) << ", " << person.GetAge(person) << endl;
}

int main() 
{
Person test_person; //default constructor
test_person.Print(); // member function
Print(test_person); // non-member function

return 0;
}
显然,您可以编写一个非成员函数,该函数使用成员getter函数访问类的私有成员,这样您就可以以任何一种方式进行访问

在我看来,将
Print()
作为类
Person
的成员函数是一种可行的方法,因为该函数显然是特定于类及其私有数据的,如果其他人使用该类,可能会希望其他人使用该函数


是这样吗?我还应该考虑什么?

您的代码与下面的代码类似:

private:
 string name;
 int age;
这些属性只能在类对象内部访问。不能从对象外部调用它,只能使用geter(),seter()来获取、设置对象的值


如果使用公共属性,则在C/C++

上有类似于
struct
structure的代码,您的代码类似于以下代码:

private:
 string name;
 int age;
这些属性只能在类对象内部访问。不能从对象外部调用它,只能使用geter(),seter()来获取、设置对象的值


如果使用公共属性,在C/C++ +/p> < p>上,类似于Stult结构。我想您可能想考虑一下<代码>访问修饰符< /C>。您不能修改类的

private
protected
数据成员。因此,您需要为它们提供成员函数。

我想您可能想考虑一下<代码>访问修饰符< /代码>。您不能修改类的
private
protected
数据成员。因此,您需要为它们提供成员函数。

更喜欢成员函数而不是非成员函数。假设您将名称从
Print
更改为
Log
,并且忘记了名称。对于大多数IDE,可以通过键入“.”轻松查找成员函数,然后找到正确的函数,而非成员函数在找到正确的函数之前需要多次按键猜测

我还要说,在许多情况下,成员函数使用起来更直观


实现这两种方法也不被认为是坏做法。例如,对于
std::vector v
,有成员函数
v.size()
以及通用非成员函数
std::size(v)

更喜欢成员函数而不是非成员函数。假设您将名称从
Print
更改为
Log
,并且忘记了名称。对于大多数IDE,可以通过键入“.”轻松查找成员函数,然后找到正确的函数,而非成员函数在找到正确的函数之前需要多次按键猜测

我还要说,在许多情况下,成员函数使用起来更直观


实现这两种方法也不被认为是坏做法。例如,对于
std::vector v
,有成员函数
v.size()
以及通用非成员函数
std::size(v)

这是否回答了您的问题@乔治一世撤回了我的投票,但我仍然相信这会有所帮助。据我所知,类应该提供尽可能少的成员函数,这些函数本质上是使用它所需要的,即检索应该公开的内部构件,以及以或多或少复杂的方式修改内部构件。使用这些成员函数,其他所有内容都应该成为自由函数。谢谢,我不知道非成员函数被称为自由函数,这就是为什么我搜索时没有出现任何结果。@Scheff Fair point。我认为答案确实涵盖了op的问题。如果他们的问题的P.O.V有一种稍微密集/简明的方式(但也许这只是我的疲劳)。考虑使用标准和C++,这能回答你的问题吗?乔治一世撤回了我的投票,但我仍然相信这会有所帮助。据我所知,类应该提供尽可能少的成员函数,这些函数本质上是使用它所需要的,即检索应该公开的内部构件,以及以或多或少复杂的方式修改内部构件。使用这些成员函数,其他所有内容都应该成为自由函数。谢谢,我不知道非成员函数被称为自由函数,这就是为什么我搜索时没有出现任何结果。@Scheff Fair point。我认为答案确实涵盖了op的问题。如果从他们的问题的P.O.V中稍微密集/简洁的方式(但可能这只是我累了)。如果你想修改一个类的主或另一个类中的私有或受保护的数据成员,可以考虑使用标准和C++。也许你应该考虑它们是否应该是私有的和/或该类的一部分。访问和修改意味着两个非常不同的事情。如果你想从主/另一个类中修改一个类的私有或受保护的数据成员。也许你应该考虑他们是否应该是私人和/或这一类的一部分。访问和修改意味着两个非常不同的事情。