C++ 封装混乱

C++ 封装混乱,c++,C++,我不知道如何正确封装对象 例如: struct Car { int wheels = 0; int doors = 0; }; class A{ Car myCar; public: // 1st method Car getCar() const { return myCar; } void setCar(Car c) { myCar = c; } // 2nd method Car &getCarReference() { retu

我不知道如何正确封装对象

例如:

struct Car {
    int wheels = 0;
    int doors = 0;
};

class A{
    Car myCar;

public:
// 1st method
    Car getCar() const { return myCar; }
    void setCar(Car c) { myCar = c; }
// 2nd method
    Car &getCarReference() { return myCar; }
// 3rd method
    Car *getCarPointer() { return &myCar; }
};

据我所知,第一种方法复制了我的结构,如果结构像示例中所示的那样小,这是很好的。但是,如果结构包含100000个双值呢。那么我应该使用第二种方法吗?或者声明结构指针,动态分配内存并使用第三种方法?

我假设您想要的是:

某一类,A,包裹另一类,汽车。应该可以访问的Car元素,但是,您不能将Car元素公开,因为如果有人随后更改该元素(如果没有,则只需将其公开),那么包装器类可能会不一致

如果是,请使用常量引用:

const Car& getConstCarReference() const { return myCar; }
这就叫做like

const Car& car = instanceOfA.getConstCarReference();
在那之后,你可以随时拜访汽车

顺便说一下,在大多数情况下,返回指针是个坏主意。本质上,每当您想到返回指针时,您都应该能够清楚地说明为什么返回指针是最好的解决方案


也就是说,我建议不要使用“get”和“set”等方法名。使代码看起来更像时钟,而不是处理有机类。我建议您将该方法简单地命名为car,如
const car&car()const{return m_car;}
所示,它是匈牙利符号中的成员变量(使用匈牙利符号并不重要,但我建议清楚地标记成员变量,至少在类不是很小的情况下。为成员使用类似于
\u car
car
的方法也很有效。)

阅读和。不要对优化进行微观管理,也不要过早地进行优化。始终编写好的、可维护的、可读的和可工作的代码。如果性能“不够好”您可以测量、分析和基准测试以发现瓶颈并对其进行优化。问题的标题有点误导。问题似乎是关于值类型的语义与引用类型的语义,这与封装无关。请阅读关于
const
reference的内容。这应该会有所帮助。