我只是想知道如果我只允许一个const引用变量,我是否可以绕过使用getter,如下所示
#includeclass cTest { private: int m_i; std::string m_str; public: const int & i; const std::string & str; cTest(void) : i(m_i) , str(m_str) {} }; int main(int argc, char *argv[]) { cTest o; int i = o.i; // works o.i += 5; // fails o.str.clear(); // fails return 0; }
我想知道为什么人们似乎根本不这样做.我缺少一些严重的劣势吗?请提供优缺点列表,并在必要时予以纠正.
好处:
通过调用getter函数没有任何开销.
程序大小减少,因为功能较少.
我仍然可以修改类的内部,引用变量提供了一层抽象.
缺点:
我有很多参考资料,而不是getter函数.这会增加对象大小.
使用const_cast
,人们可以搞乱私人成员,但这些人是恶作剧的,对吧?
Bathsheba.. 7
确实存在一些严重的缺点(除了你提到的第二个缺点,我也提到了"严重"类别):
1)您需要提供(并因此维护)复制构造函数:编译器默认值不起作用.
2)您需要提供赋值运算符:编译器默认值不起作用.
3)仔细考虑实现移动语义.同样,编译器默认值不起作用.
这三件事意味着const
你提出的参考反模式是非首发.不要这样做!
确实存在一些严重的缺点(除了你提到的第二个缺点,我也提到了"严重"类别):
1)您需要提供(并因此维护)复制构造函数:编译器默认值不起作用.
2)您需要提供赋值运算符:编译器默认值不起作用.
3)仔细考虑实现移动语义.同样,编译器默认值不起作用.
这三件事意味着const
你提出的参考反模式是非首发.不要这样做!