我正在将C++程序转换为C#,但这部分让我感到困惑。return*this是什么意思?templateclassCDemoMessagePB:publicIDemoMessage,publicPB_OBJECT_TYPE{(...)virtual::google::protobuf::Message&GetProtoMsg(){return*this;}}它将如何转化为C#? 最佳答案 this表示指向对象的指针,所以*this是一个对象。因此,您要返回一个对象,即*this返回对该对象的引用。
我目前正在用C++做我的第一个真正的项目,所以对指针来说还很陌生。我知道它们是什么并且已经阅读了一些基本的使用规则。可能还不够,因为我仍然不太了解何时使用它们,何时不使用它们。问题是大多数地方只是提到大多数人要么过度使用它们,要么使用不足。我的问题是,何时使用它们,何时不使用它们?。目前,在很多情况下我在问自己,我应该在这里使用指针还是只将变量本身传递给函数。例如,我知道您可以发送一个指向函数的指针,这样函数实际上可以更改变量本身而不是变量的拷贝。但是,当您只需要一次获取对象的一些信息时(例如,该方法需要一个getValue()之类的东西),在这种情况下指针有用吗?我很想看到任何一种r
当C++编译器为引用和指针生成非常相似的汇编代码时,为什么与指针相比更喜欢使用引用(并且被认为更安全)?我看到了DifferencebetweenpointervariableandreferencevariableinC++其中讨论了它们之间的差异。EDIT-1:我正在查看g++为这个小程序生成的汇编代码:intmain(intargc,char*argv[]){inta;int&ra=a;int*pa=&a;} 最佳答案 它被认为更安全,因为很多人“听说”它更安全,然后告诉其他人,而这些人现在也“听说”它更安全。没有一个了解引用
在处理数组时,标准算法(在C和C++中)通常返回指向元素的指针。有时拥有元素的索引很方便,也许可以索引到另一个数组,我通常通过从指针中减去数组的开头来得到它:intarr[100];int*addressICareAbout=f(arr,100);size_tindex=addressICareAbout-arr;这似乎总是足够简单和有效。然而,最近有人向我指出,指针减法实际上返回一个ptrdiff_t,原则上,如果“index”不适合,可能会出现问题一个ptrdiff_t。我真的不相信任何实现都足以允许一个人创建如此大的arr(从而导致此类问题),但公认的答案here承认这是可能的,
这个问题跟在这个one之后让我们考虑这个示例代码:structsso{union{struct{char*ptr;charsize_r[8];}large_str;charshort_str[16];};boolis_short_str()const{return*std::launder(short_str+15)=='\0';//UB?}};如果short_str不是事件成员,则在没有std::launder的情况下取消引用指针将是UB。让我们考虑一下ABI已明确指定,并且我们知道size_r[7]与short_str[15]位于同一地址。当short_str不是union体的活跃
对于重要的代码(也在wandboxhere上)感到抱歉#include#includetemplatevoidtest_1(Args...args){usingnamespacestd;ifconstexpr(1>(sizeof...(args))){return;}else{autoarg_list[[maybe_unused]]={args...};}}templatevoidtest_2(Args...args){autoarg_list[[maybe_unused]]={args...};}////////////////////////////////////////////
当我在MSVSC++2010上运行此代码时:#includeintmain(){constinta=10;constint*b=&a;int*c=(int*)b;*c=10000;std::cout输出是:0037F7840037F784100001010编写该代码的动机是来自Stroustrup的“TheC++ProgrammingLanguage”中的这句话:“可以通过显式类型转换显式地移除对指向const的指针的限制”。我知道试图修改常量在概念上是错误的,但我发现这个结果很奇怪。谁能解释一下背后的原因? 最佳答案 让我们从显而
我有一个功能:voidget_good_items(conststd::vector&data,std::vector&good_items);此函数应检查所有数据并找到满足条件的项目,并在good_items中返回它们所在的位置。用什么代替std::vector最好?std::vector包含所有好的索引。std::vector包含指向项目的指针。std::vector::iterator>包含项目的迭代器。其他??编辑:我将如何处理good_items?很多事情......其中之一是从vector中删除它们并将它们保存在其他地方。也许以后再做别的编辑2:对我来说最重要的问题之一是如
我想要一些关于在这种情况下比较指针时的最佳实践的信息:classBase{};classDerived:publicBase{};Derived*d=newDerived;Base*b=dynamic_cast(d);//WhencomparingthetwopointersshouldIcastthem//tothesametypeordoesitnotevenmatter?booltheSame=b==d;//Or,booltheSame=dynamic_cast(b)==d? 最佳答案 如果你想比较任意类层次结构,安全的做法是
有没有办法用一些c++11或至多一个boost库来做到这一点?#include#includeusingnamespacestd;templateclassremove_all_pointers{public:typedefTtype;};templateclassremove_all_pointers{public:typedeftypenameremove_all_pointers::typetype;};intmain(){//correctlyprints'i'ongcccout::type).name() 最佳答案 这并不