我目前正在创建一个实用程序类,其中将包含重载的运算符。使它们成为成员或非成员(friend)函数的优缺点是什么?还是根本不重要?也许对此有最佳实践? 最佳答案 我会选择“C++编码标准:101条规则、指南和最佳实践”:如果您可以将其作为非成员函数来执行,请将其作为非成员函数(在同一命名空间中)执行。原因之一:它与隐式类型转换一起工作得更好。示例:您有一个带有重载运算符*的复杂类。如果要写成2.0*aComplexNumber,则需要operator*为非成员函数。另一个原因:更少的耦合。非成员函数的耦合程度低于成员函数。这几乎总是一
我有以下代码:structM{friendvoidf(){}M(){f();//error:'f'wasnotdeclaredinthisscope}};intmain(){Mm;}Liveexampleg++4.8和clang3.4都无法编译它,因为f在M中不可见,或者他们是这么说的。但是,标准给出了类似代码的例子classM{friendvoidf(){}//definitionofglobalf,afriendofM,//notthedefinitionofamemberfunction};然后说Afriendfunctiondefinedinaclassisinthe(lexi
为什么下面的代码在g++中编译良好,但在clang上却出错?#includeclassObject{};classPrint{public:templateinlinefriendstd::basic_ostream&operator&out,constObject&){return(out证明链接:g++/clang++当我将友元函数移动到全局命名空间时,代码为两个编译器编译得很好(clang++/g++)。在这种情况下,哪种实现更符合C++标准? 最佳答案 Clang在这里是正确的。在类内部定义的友元函数只能通过对其参数使用参数
我最近发现friend声明范围遵循extremelypeculiarrules-如果您有一个尚未声明的函数或类的friend声明(定义),它会在紧邻的命名空间中自动声明(定义),但是非限定和限定查找不可见;但是,友元函数声明通过参数相关的查找仍然可见。structM{friendvoidfoo();friendvoidbar(M);};voidbaz(){foo();//error,unqualifiedlookupcannotfindit::foo();//error,qualifiedlookupcannotfinditbar(M());//ok,thankstoADLmagic}
考虑这段代码:namespacefoo{}classA{classB{};friendintfoo::bar(B&);};namespacefoo{intbar(A::B&){}}G++4.4.3告诉我:friendfun-innerclass.cpp:21:error:'intfoo::bar(A::B&)'shouldhavebeendeclaredinside'foo'但我不能声明:namespacefoo{intbar(A::B&);}在A类定义之前,因为A::B尚未声明。而且我显然不能声明“A类::B”,要声明B类,我必须给出A类的定义,据我所知,“friend”声明必须在A
我的问题是关于友元函数以及重载>。据我了解,我认为友元函数可以(并且应该)直接访问私有(private)成员变量。但是在我在这里的情况下,当我使用“get”函数获取每个私有(private)变量时,编译器只会接受我的.cxx文件。这是我的头文件classBigNumpublic://CONSTRUCTORSandDESTRUCTORSBigNum();BigNum(intnum,size_toptional_base=10);BigNum(constcharstrin[],size_toptional_base=10);//MEMBERFUNCTIONSsize_tget_digit(
出于教学目的,我一直在尝试实现自己的链表类。我在迭代器声明中将“List”类指定为友元,但它似乎无法编译。这些是我使用过的3个类的接口(interface):Node.h:#definenull(Node*)0templateclassNode{public:Tcontent;Node*next;Node*prev;Node(constT&_content):content(_content),next(null),prev(null){}};Iterator.h:#include"Node.h"templateclassIterator{private:Node*current;It
我对C++中的友元函数存有疑问。Friend函数不是claas的成员函数,可以直接从main调用。那么,如果我们将friend函数保留在private或class的public部分中会有什么区别>。我通常注意到friend函数总是在公共(public)部分。在什么情况下我们应该将friend函数保留在private中。 最佳答案 编译器不会关注友元函数是在类的私有(private)部分还是公共(public)(或protected)部分。大多数人将其放在公开部分,但无论您将其放在何处,它都会公开显示。
友元函数f无权访问封闭类A的私有(private)成员。#includeclassA{conststaticintp=1;classB{friendvoidf(){std::cout至少,我认为N4140中的[class.nest]/4是这样说的(见下文)。§9.7/4Likeamemberfunction,afriendfunction(11.3)definedwithinanestedclassisinthelexicalscopeofthatclass;itobeysthesamerulesfornamebindingasastaticmemberfunctionofthatcl
假设我有一个Base类:classBase{friendSomeOtherClass;};还有另一个(不同的)类继承自Base:classAnotherClass:publicBase{}友元也会继承吗? 最佳答案 原则上,派生类继承基类的每个成员,除了:*itsconstructoranditsdestructor*itsoperator=()members*itsfriends所以,不。friend不会被继承。 关于c++-友元是在C++中继承的吗?,我们在StackOverflow