草庐IT

c++ - 用于遍历继承层次结构的 Static_cast 与 dynamic_cast

我看到一本关于C++的书提到使用静态转换在继承层次结构中导航比使用动态转换更有效。例子:#include#includeusingnamespacestd;classShape{public:virtual~Shape(){};};classCircle:publicShape{};classSquare:publicShape{};classOther{};intmain(){Circlec;Shape*s=&c;//Upcast:normalandOK//Moreexplicitbutunnecessary:s=static_cast(&c);//(Sinceupcastingis

c++ - 如果我将 double 转换为 int,但 double 的值超出范围会怎样?

如果我将double转换为int,但double的值超出范围会怎样?假设我做了这样的事情?doubled=double(INT_MIN)-10000.0;inta=(int)d;a的值是多少?是否未定义? 最佳答案 没错。引用标准4.9,“如果截断值不能在目标类型中表示,则行为未定义。” 关于c++-如果我将double转换为int,但double的值超出范围会怎样?,我们在StackOverflow上找到一个类似的问题: https://stackoverf

c++ - 不寻常的 static_cast 语法

我设法追踪到以下表达式的错误:foo(static_cast(a,b));//Executesspecialisation1右括号位置错误。正确的说法应该是:foo(static_cast(a),b);//Executesspecialisation2我从未见过static_cast与形式(a,b)一起使用,也从未在任何地方见过它的描述。这是什么意思?前面的语句返回b。 最佳答案 static_cast不是一个函数,它是一个关键字,所以a,b中的逗号不是参数分隔符;它是commaoperator.它评估a但丢弃结果。表达式的计算结果

c++ - 铸件内的符号

我遇到了这段代码intn1=10;intn2=(int&)n1;我不明白这个转换的含义,n2不是引用,因为修改n1不会反射(reflect)n1。奇怪的是,这段代码在gcc中抛出编译器错误,而在VC++中编译正常。有人知道这个转换的含义吗? 最佳答案 这是完全有效的C++代码,并且可以使用g++4.4.1进行编译。它创建一个对n1的临时引用,然后使用该引用引用的值来初始化n2。如果将其表示为函数,可能更容易理解:voidf(int&n1){intn2=n1;//initialisewithvaluuereferredtobyn1}请

C++ 以编程方式转换 : can it be done?

假设我有一个Base类和几个Derived类。有什么方法可以将对象转换为派生类之一而无需编写如下内容:stringtypename=typeid(*object).name();if(typename=="Derived1"){Derived1*d1=static_cast(object);}elseif(typename=="Derived2"){Derived2*d2=static_cast(object);}...else{...} 最佳答案 不要。阅读多态性。几乎每一种“动态转换”情况都是多态难以实现的例子。无论您在动态类型

c++ - 涉及私有(private)继承的 C 风格向上转型和向下转型

考虑以下代码:-classA{};classB:privateA{};B*bPtr1=newB;//A*aPtr1=bPtr1;//error//A*aPtr2=static_cast(bPtr1);//errorA*aPtr3=(A*)bPtr1;B*bPtr2=(B*)aPtr3;当隐式和static_cast都失败时(还有dynamic_cast),C风格的转换丢弃了私有(private)继承。为什么?如果C风格的转换只是一些小事,那么C++转换是如何实现的,即它们如何从内存占用中知道继承类型?在将bPtr1转换为aPtr3之后,我将不得不使用另一个C风格的转换来向下转换为B,因

c++ - 在不相关的全等类之间进行转换

假设我有两个类,它们具有来自两个不同库的相同成员:namespaceA{structPoint3D{floatx,y,z;};}namespaceB{structPoint3D{floatx,y,z;};}当我尝试交叉转换时,它成功了:A::Point3Dpa={3,4,5};B::Point3D*pb=(B::Point3D*)&pa;coutxyz这在什么情况下保证有效?总是?请注意,编辑外部库以添加对齐编译指示或类似内容是非常不可取的。我在Ubuntu8.10上使用g++4.3.2。 最佳答案 如果您使用的结构只是数据并且没有

c++ - 确定数值类型 A 是否可以转换为数值类型 B

给定两个数字类型From和To。以下代码是否真的确定了From类型的任何值是否可以表示为To类型的值而不丢失信息?如果是,是否有更短或更易读的确定方法?templatestructcan_cast{staticconstboolvalue=(std::numeric_limits::is_integer||//eitherFromisanintegertypeORstd::is_floating_point::value)&&//...they'rebothfloatingpointtypesAND(std::numeric_limits::is_signed==false||//ei

c++ - 可以通过强制转换为布局兼容类型来访问私有(private)成员函数吗?

来自对这个问题的讨论HowisaccessforprivatevariablesimplementedinC++underthehood?我提出了一个变体:不是访问私有(private)数据成员,而是可以通过强制转换和依赖布局兼容性来调用私有(private)成员函数吗?一些代码(灵感来自HerbSutter的专栏UsesandAbusesofAccessRights)#includeclassX{public:X():private_(1){/*...*/}private:intValue(){returnprivate_;}intprivate_;};//Nastyattemptt

C++ 将浮点值转换为枚举 - 但不是 VS 2010

我有一些模板代码适用于Xcode4.5和LLVM3.0,但适用于VS2010ExpressC++工具链(v10.0.30319.1)。我正在使用我无法控制的第三方API。它以只能由API函数解释的黑盒“blob”形式为我的代码提供值://API_Secretisablack-boxencapsulationofafloating-pointnumberorabooleanvalue.//Itisprovidedbyathird-partyAPI,withassociatedaccessfunctions.//Forallintentsandpurposes,it'sacompleteb