草庐IT

c++ - 非成员函数如何改进封装

我读了ScottMeyers的article在这个问题上,对他在说什么感到很困惑。我这里有3个问题。问题1为了详细解释,假设我正在写一个简单的vector具有push_back等方法的类,insert和运算符[].如果我遵循Meyers的算法,我最终会得到所有非成员friend函数。我将有一个带有少量私有(private)成员和许多非成员friend函数的vector类。这是他在说的吗?问题2我仍然不明白非成员函数如何改进封装。考虑一下Meyers文章中给出的代码。classPoint{public:intgetXValue()const;intgetYValue()const;voi

c++ - 非成员非友元函数语法

他们是否可以使用与成员函数相同的“点”表示法在对象上使用非成员非友元函数?我能否将(任何)成员从类中拉出来,让用户像往常一样使用它?更长的解释:ScottMeyers,HerbSutter等人认为非成员非友元函数是对象接口(interface)的一部分,并且可以改进封装。我同意他们的看法。然而,在最近阅读这篇文章之后:http://www.gotw.ca/gotw/084.htm我发现自己在质疑语法含义。在那篇文章中,Herb提议使用一个insert、erase和replace成员,以及几个非成员非友元函数同名。这是否意味着,如我所想,Herb认为某些函数应该与点符号一起使用,而其他函

c++ - 为什么非成员静态 constexpr 变量不隐式内联?

在C++17中,我们得到了内联变量,我假设全局constexpr变量是隐式内联的。但显然这仅适用于静态member变量。这背后的逻辑/技术限制是什么?来源:Astaticmembervariable(butnotanamespace-scopevariable)declaredconstexprisimplicitlyaninlinevariable. 最佳答案 这里的重点是命名空间范围内的constexprintx=1;在C++14中具有内部链接。如果在不更改内部链接部分的情况下将其隐式内联,则更改将无效,因为内部链接意味着无论如

c++ - 静态、非成员或静态非成员函数?

每次我有一些“实用”方向的功能时,我最终都会想知道哪个选项是最好的。例如,在我工作的上下文中打印消息结构(自己的或外部的)、一些编码/解码代码或一些有用的转换函数。我考虑的方案是:1)辅助类/结构中的静态函数。structhelper{staticbooldoSomething(...);};2)非成员函数。namespacehelper{booldoSomething(...);}3)静态非成员函数。namespacehelper{staticbooldoSomething(...);}在某些情况下,可能需要在“实用程序”中初始化或保持状态,因此我选择选项1以避免“全局”状态。但是,

c++ - 非成员好友函数总是内联的

我是C++的新手,当我尝试学习friend函数时,我从frienddescriptiononCppreference看到了那:2)(onlyallowedinnon-localclassdefinitions)Definesanon-memberfunction,andmakesitafriendofthisclassatthesametime.Suchnon-memberfunctionisalwaysinline.classX{inta;friendvoidfriend_set(X&p,inti){p.a=i;//thisisanon-memberfunction}public:v

c++ - 将运算符重载为成员函数或非成员(友元)函数?

我目前正在创建一个实用程序类,其中将包含重载的运算符。使它们成为成员或非成员(friend)函数的优缺点是什么?还是根本不重要?也许对此有最佳实践? 最佳答案 我会选择“C++编码标准:101条规则、指南和最佳实践”:如果您可以将其作为非成员函数来执行,请将其作为非成员函数(在同一命名空间中)执行。原因之一:它与隐式类型转换一起工作得更好。示例:您有一个带有重载运算符*的复杂类。如果要写成2.0*aComplexNumber,则需要operator*为非成员函数。另一个原因:更少的耦合。非成员函数的耦合程度低于成员函数。这几乎总是一

c++ - 非成员转换函数;类型转换不同的类型,例如DirectX vector 到 OpenGL vector

我目前正在开发一个游戏“引擎”,它需要在3D引擎、物理引擎和脚本语言之间移动值。由于我需要经常将来自物理引擎的vector应用于3D对象,并且希望能够通过脚本系统控制3D和物理对象,因此我需要一种机制来转换一种类型的vector(例如vector3d)到其他类型的vector(例如btVector3)。不幸的是,我无法对类/结构的布局方式做出任何假设,所以一个简单的reinterpret_cast可能不会。所以问题是:是否有某种“静态”/非成员转换方法基本上可以实现这一点:vector3doperatorvector3d(btVector3vector){//convertandret

c++ - 非成员非 friend 函数与私有(private)函数

HerbSutter说过,在C++中编写方法最面向对象的方式是使用非成员非友元函数。这是否意味着我应该采用私有(private)方法并将它们转换为非成员非friend函数?这些方法可能需要的任何成员变量都可以作为参数传入。示例(之前):classNumber{public:Number(intnNumber):m_nNumber(nNumber){}intCalculateDifference(intnNumber){returnminus(nNumber);}private:intminus(intnNumber){returnm_nNumber-nNumber;}intm_nNum

C++11:非成员 rbegin()/rend() 函数

既然在C++11修订版中为标准包含添加了非成员begin()和end()函数,为什么会有非成员版本的rbegin()和rend()函数也没有添加?开始使用begin()和end()的非成员版本后,我觉得很傻,才发现我现在必须在使用成员和非成员函数之间切换来电。(我意识到推出我自己的非成员版本的rbegin()和rend()是微不足道的,但我想知道为什么没有将它添加到标准)。感谢您的意见。 最佳答案 对于以后看到这个的人来说,非成员rbegin()和rend()已经在C++14中了。 关于

python - Python中的非成员与成员函数

我对Python比较陌生,并且努力协调该语言的特性与我从C++和Java背景中养成的习惯。我遇到的最新问题与封装有关,特别是Meyer的“EffectiveC++”的第23条最好地总结了一个想法:Prefernon-membernon-friendfunctionstomemberfunctions.暂时忽略friend机制的缺失,在Python中,非成员函数是否也被认为比成员函数更可取?一个强制性的,愚蠢的例子:classVector(object):def__init__(self,dX,dY):self.dX=dXself.dY=dYdef__str__(self):return