草庐IT

c++ - 旧版本的 C++ 在评估 `int` 语句中的条件时是否使用了类的 `if()` 运算符?

现代版本的C++在评估if()语句中的条件时尝试使用类的bool运算符。其他转换运算符,例如int在不存在bool运算符时使用。如下所示。#includeusingnamespacestd;classTwoInts{public:inta,b;operatorbool(){cout运行这段代码不会产生任何意外:TwoIntstoboolSixIntstoint查看一些旧的C++代码,似乎有一个更改需要验证。旧版本的C++在评估if()语句中的条件时是否使用了类的int运算符?什么版本(如果有)做过某事?那么建议的输出应该是TwoIntstointSixIntstoint关于问题原因的一

c++ - 设置回调函数,它是类的非静态成员函数

typedefvoid(*CALLBACK)();classFilter{public:voidcallback(){cout在主函数中,SetCallback(f.callback);声明给出错误。谁能帮我解决这个问题 最佳答案 问题是成员函数不是没有参数的普通函数,因为它总是有隐式的this参数。如果您遇到一个遗留C接口(interface),它需要一个没有用户上下文参数的普通回调函数(一个void*,该函数只是传递给回调),您就有问题了。如果您确实拥有用户上下文,那很容易。将对象指针作为上下文传递,并使用包装函数作为实际回调:

c++ - 如果类的成员是引用,为什么复制对象是非法的?

我遇到了一个测验,说下面第18行的代码格式错误,因为“当需要复制的成员之一是引用时,使用隐式定义的赋值运算符格式错误。”我无法理解。为什么无法复制引用?为什么16号线是合法的?第16行与第18行非常相似,复制构造函数仍然需要进行复制,对吧?1#include23structA4{5A(int&var):r(var){}67int&r;8};910intmain(intargc,char**argv)11{12intx=23;1314Aa1(x);1516Aa2=a1;1718a2=a1;1920return0;21} 最佳答案 第1

c++ - 如何正确声明模板类的嵌套类的友元?

当我执行以下操作时:templateclassContainer{public:classIterator{friendbooloperator==(constIterator&x,constIterator&y);};};gcc给我以下警告和建议:warning:frienddeclaration'booloperator==(constContainer::Iterator&,constContainer::Iterator&)'declaresanon-templatefunction[-Wnon-template-friend]friendbooloperator==(cons

c++ - 我需要销毁新类的每个实例吗?

本质上,如果我创建一个新类的多个实例,我是否需要为每个实例调用析构函数,或者在销毁每个实例时调用它(如果我使用模糊/错误的术语,构造函数/析构函数,我深表歉意是我还没有完全掌握的概念)。更具体地说,这是我正在使用的一些代码(如果样式不好,我将不得不再次道歉,我有一个学校问题的想法,想尽快把代码写下来)。while(read>>f>>l>>t>>s>>sta>>acct>>bal){coutprintcontents();cout所以为了这个问题,假设这将循环三次。我只需要调用一次“帐户”的析构函数来销毁新帐户的所有三个实例,还是一个调用会留下另外两个?这甚至是一种好的做法吗?编辑:我注

c++ - 声明一个类的变量而不创建它的实例

我正在学习C++。我想声明一个变量而不创建它的实例。MyClassvariable;//Morecodeintmain(intargc,char**argv){//Morecodevariable=MyClass(0);//Morecode}如果我这样做,并且MyClass只有一个声明为MyClass::MyClass(intvalue)的构造函数,它将失败。我需要将其设为全局,因为我将在回调函数中使用它,并且我可以将该变量作为参数传递。而且,我不想在声明变量时创建类的实例,然后在使用构造函数时创建另一个实例。我认为我在浪费资源和CPU时间。是否可以在没有实例的情况下声明一个变量?

c++ - 仅在与类的其他对象进行比较时,是否有任何理由不将 operator== 作为成员重载?

我一直在互联网上寻找答案,但我找不到任何答案。给出的唯一原因似乎与比较不同类型的对象有关(例如MyClass==int)。但最常见的用例是将一个类实例与同一类的另一个实例进行比较,而不是与任何不相关的类型进行比较。换句话说,我确实理解以下方面的问题:structA{booloperator==(intb);};但是我找不到任何好的理由在最明显的用例中不使用成员函数:structA{booloperator==(constA&);};最规范的重复Whatarethebasicrulesandidiomsforoperatoroverloading?作为经验法则说“将二元运算符重载为非成员

c++ - operator new 如何调用类的构造函数?

我知道,new操作符会调用类的构造函数。但是它是如何发生的,用于此的底层技术是什么。 最佳答案 这是我想象的样子:T*the_new_operator(args){void*memory=operatornew(sizeof(T));T*object;try{object=new(memory)T(args);//(*)}catch(...){operatordelete(memory);throw;}returnobject;}(*)从技术上讲,它并不是真正调用placement-new,但只要你不重载它,心智模型就可以正常工作:

c++ - std::ifstream 类的设计

我们这些看到了STL之美的人会尽可能多地使用它,并鼓励其他人在我们看到他们使用原始指针和数组的任何地方使用它em>。ScottMeyers写了一本关于STL的书,书名为EffectiveSTL.然而ifstream的开发人员发生了什么,他们更喜欢char*而不是std::string。我想知道为什么ifstream::open()的第一个参数是constchar*类型,而不是conststd::string&。请看一下它的签名:voidopen(constchar*filename,ios_base::openmodemode=ios_base::in);这是为什么?为什么不是这个:v

c++ - 是否可以在分配期间在 C++ 中给出一个类的定义,这在 Java 中是允许的

或者简单地说我可以做一些事情吗classA{public:virtualvoidfoo()=0;};classB{public:A*a;b(){a=newA(){voidfoo(){printf("hello");}}}; 最佳答案 不,C++没有像Java那样的匿名类。你可以像这样定义本地类:classB{public:A*a;b(){structmy_little_class:publicA{voidfoo(){printf("hello");}};a=newmy_little_class();}};或者可能只是一个嵌套类:cl