草庐IT

Pythonic魔法——运算符

全部标签

c++ - 什么时候使用内部运算符,什么时候使用外部运算符

假设我定义了一个带有内部+运算符和外部+运算符的类;classMyClass{public:MyClassoperator+();};MyClassoperator+(constMyClass&a);如果在我的主程序中调用MyClassa;MyClassb=+a;正在调用什么,这个(内部):a.operator+()或这个(外部)?:operator+(a)二元运算符的相同问题。 最佳答案 选择成员函数:可以直接绑定(bind)表达式a,非成员函数需要将MyClass转换为constMyClass在绑定(bind)到引用参数之前。因

c++ - 在同一行上使用变量时的预递增运算符

我-相信-我正在尝试做的事情可能是有效的,因为它在两种情况下都用逗号分隔(不是典型的分配),但我不确定并且搜索没有提出任何问题关于这两种具体情况。在这两种情况下,我都使用变量作为两个并行数组的索引。inta[3]={10,20,30};intb[3]={20,40,60};情况#1:为数组初始化结构structtestStruct{intt1;intt2;};inti=0;testStructtest={a[++i],b[i]}最后一行的预期结果:test={20,40}情况#2:将数组中的特定值作为函数参数传递voidtestFunc(intt1,intt2){//dostuff}i

c++ - 在 C++ 中使用友元函数进行 I/O 运算符重载

我正在自学C++。我正在研究运算符重载,我能够理解加法和减法运算符重载。但是I/O运算符的重载有点令人困惑。我已经为复数创建了一个类,现在我正在重载运算符。Complex.h的函数原型(prototype)friendostream&operatorComplex.cpp中的函数ostream&operator谁能(在基本层面上)解释为什么我们必须在这里使用友元函数声明?为什么我们必须通过引用传递所有参数和运算符的返回类型?这个函数在不使用const的情况下工作正常,但为什么我们在这里使用const?将Complex作为常量引用传递有什么好处? 最佳答案

c++ - 重载派生类的比较运算符==以扩展任意数量的基类

我很感激关于如何重载派生类Derived的比较运算符operator==的指示,以便它可以扩展到任意数量的基类,Base1,Base2,Base3,...,(参见下面的代码,完整版在ideone上)。我怀疑可以利用bostMPLfor_each或一些类似的构造来调用基类(类型)的列表上的比较。//RealproblemhasmanymoremoreBaseclassesclassDerived:publicBase1,publicBase2{public:Derived(unsigned&val1,unsigned&val2):Base1(val1),Base2(val2){}//Ca

运算符小于非无效的RAW指针和NullPtr

是操作nullptr和ptr定义为非无效的原始指针ptr!=nullptr?欢迎来自C++标准的报价。看答案这样的比较是良好的,但未指定的结果。[expr.rel]/3比较指针与对象的定义如下:-如果两个指针指向同一数组的不同元素,或者指向其子对象,则具有更高下标的指向元素的指针会更大。-如果一个指针指向数组的一个元素,或者指向其子对象,而另一个指针指向数组的最后一个元素,则后一个指针比较更大。-如果两个指针指向同一对象的不同非静态数据成员,或者指向此类成员的子对象,则递归,如果两个成员具有相同的访问控件(第11节),则更大的指向后面声明的成员进行比较。他们的班级不是工会。[expr.rel]

c++ - 显式调用类的强制转换运算符方法是否比强制转换更好?

如果一个类提供了一个方法operatorwchar_t*并且我在编译器无法自动推断转换的情况下使用此类的实例,显式调用转换运算符方法而不是实际执行转换是否被认为是不好的?例如:x.doStuff(o.operatorwchar_t*())对比x.doStuff(static_cast(o))第一个选项是坏的/错误的,还是调用一个运算符方法是完全可以接受的? 最佳答案 至少这是不寻常的……特别是因为第二个结构非常地道。即使使用普通的转换运算符也应该更好。 关于c++-显式调用类的强制转换运

c++ - C++ new 运算符能保证返回的指针不会改变它的值吗?

在C++中:constsize_tN=1000;int*p=newint[N];//time=t0我的程序只有一个线程,在为p分配内存后,我的程序将只读取p指向的内存。标准对p的值有何规定?p是否会保留它在time=t0时获得的值,直到p被删除?或者,操作系统能否自行决定重新分配p指向的内存?是否取决于N的值? 最佳答案 p的值在创建后不能移动。该标准使这样做毫无用处:3.7.4.1分配函数...如果请求成功,则返回值应为非空指针值(4.10)p0,不同于任何先前返回的值p1,除非该值p1随后被传递给操作符delete。(引用标准结

C++ 运算符重载错误检查无异常

我有一个类似于vector的类,它主要是一个动态大小的数组。我正在为资源有限的平台编写它,因此我必须不使用异常。很明显,要使用运算符重载来简化此类动态分配的接口(interface),必须在某些运算符重载函数中执行。赋值运算符(=)就是一个例子。尽管无一异常(exception),以一种明智的方式将错误的分配错误通知调用者,同时仍然保持强大的错误安全性变得相当具有挑战性。我可以有一个类的错误属性,调用者必须在每次涉及动态分配的调用后检查它,但这似乎不是一个最佳解决方案。编辑:这是我目前得到的最好的想法(在上一段中被突出显示为一个不太理想的解决方案),任何改进将不胜感激:dyn_arr&

c++ - 除非满足静态条件,否则阻止转换运算符编译

我有Vector(CVector)、Matrix(CMatrix)和Tensor(CTensor)类,我希望能够从CTensor隐式转换类到CVector如果sizeof...(Sizes)==1类和CMatrix如果sizeof...(Sizes)==2类,所以我有以下转换运算符(最初我没有std::enable_if模板参数希望我可以使用SFINAE来防止它编译):template::type=0>operatorCMatrix()const{static_assert(sizeof...(Sizes)==2,"Youcanonlyconvertarank2tensortoamat

c++ - 使用即时计算的临时值为 ForwardIterator 实现成员访问运算符->

我正在为一个适配器范围实现一个迭代器,它懒惰地评估原始范围上的某些东西。这意味着:取消引用迭代器应该取消引用底层迭代器并对结果应用一些操作,然后返回该操作的结果。Toperator*()const{returnsomeOperation(*original_iterator);}如何实现类似于此operator*的operator->?在查看其他迭代器的实现时,它们通常返回一个T*。但是我不能返回一个指针,因为“指向对象”是一个临时的、即时计算的。在这种情况下,通常的指导是什么?我可以简单地返回一个T吗?虽然我个人不需要这个运算符(我也可以使用(*i​​).m而不是i->m并且标准算法