初学者质疑,关于循环效率.我已经开始用C++编程(我的第一语言),并且一直在使用Bjarne Stroustrup的'Principles and Practice Using C++'.我已经完成了前面几章的介绍,并且刚刚介绍了循环的概念.
关于循环的第一个练习请求如下:字符'b'是char('a'+ 1),'c'是char('a'+ 2)等.使用循环写出一个表具有相应整数值的字符:
a 97,b 98,...,z 122
虽然,我使用大写,我创建了以下内容:
int number = 64; //integer value for @ sign, character before A
char letter = number;//converts integer to char value
int i = 0;
while (i<=25){
cout << ++letter << "\t" << ++number << endl;
++i;
}
Run Code Online (Sandbox Code Playgroud)
我应该只针对"我"出现在一个循环中,还是在类型之间转换时根本不可能?除了将字符值转换为它的整数对应物(即当前方法的反面)或根本没有转换并且具有字母存储'@'之外,我无法想到除上述任何其他方式之外的其他方式.
在C++中我们可以将子类指针转换为父类,但是有没有办法将它转换回来:从父类获得,从子类获得,给孩子类回来?
我的意思是:
class Parent
{
...
};
class Child : public Parent
{
...
};
int main(int argc, char const *argv[])
{
Child* child = new Child();
Parent* parent = child;
Child* old_child = parent; // how to do this??
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的回答.
我是否正确地假设C风格的演员阵容(不鼓励)只不过是reinterpret_casts?使用后者在寻找令人讨厌的演员阵容时视觉上引人注目且易于搜索,因此推荐使用C风格的演员阵容?
如果使用const_cast抛弃const并且未定义写入原始const对象,const_cast的目的是什么?
注意:我知道Bjarne正确地谴责他们不安全的演员操作,甚至说" 丑陋的操作应该有一个丑陋的句法形式".因此C++中的转换操作符的冗长程度.所以我会尽量减少他们的使用量.诺言.:)
我有以下代码;
void* buffer = operator new(100);
unsigned char* etherhead = buffer;
Run Code Online (Sandbox Code Playgroud)
我在尝试编译时遇到以下错误;
error: invalid conversion from ‘void*’ to ‘unsigned char*’
Run Code Online (Sandbox Code Playgroud)
为什么我会得到那个错误,我认为一个空白是"无类型"所以它可以指向任何东西,或任何东西可以指向它?
在c ++中使用这些运算符而不是隐式转换有什么好处?
dynamic_cast <new_type> (expression)
reinterpret_cast <new_type> (expression)
static_cast <new_type> (expression)
Run Code Online (Sandbox Code Playgroud)
为什么,在哪里,我们应该在哪种情况下使用它们?它们在OOP中很少使用是真的吗?
直到几天前,我一直在C ++中使用C样式类型转换,因为它似乎工作良好。我最近发现在C ++中使用C是非常糟糕的..
我以前从未真正使用过C ++强制转换,所以我想知道是否有人可以告诉我(最好用自己的话说)static_cast,reinterpret_cast和const_cast之间的区别是什么?
我知道const_cast从某事物中删除了一个“ const”,但是我不确定它们之间有什么区别,以及在不同情况下需要使用什么。
我面临一个奇怪的问题。在下面的代码片段中我定义了一个类
class NewClass
{
public:
void Test()
{
cout<<"NewClass Test"<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
在我的 main() 方法中,我写道:
void main()
{
int *ptr = new int();
NewClass *n = ((NewClass *)ptr);
n->Test();
}
Run Code Online (Sandbox Code Playgroud)
它显示“NewClass Test”。我不明白如何将任何指针类型转换为 NewClass 并且仍然可以工作。
提前致谢!
将指向实例类的实例的指针强制转换为实例基类在C++中是否有任何运行时开销,还是在编译时解析?
如果确实有,那么在铸造操作中究竟需要计算什么?
例:
class Foo;
class Bar : public Foo;
Bar* y = new Bar;
Foo* x = (Foo*) y;
Run Code Online (Sandbox Code Playgroud)
(我知道我应该使用C++风格的演员表,答案可能与他们相同)
奇怪,因为它可能看起来,我无法找到如何干净地转换float到int.
这种技术
int int_value = (int)(float_value + 0.5);
Run Code Online (Sandbox Code Playgroud)
触发一个
warning: use of old-style cast
Run Code Online (Sandbox Code Playgroud)
在gcc.
那么,什么是现代风格,简单的方式转换float为int?(我当然接受精度的损失)
我试图从C++中的java中学习一些面向对象的编程方面.不过我有在使用一些困难dynamic_cast,我会用instanceofJava编写的.
我有一个基类Cell和一个派生(抽象)类Obstacle.我已经像这样定义了它:Obstacle : public Cell并且Obstacle包含一个纯虚拟析构函数.现在在Cell课堂上我想实现一个方法bool Cell::isAccesible().我已经实现了如下:
bool Cell::isAccessible() {
Obstacle *obs = dynamic_cast<Obstacle*>(this);
if (obs != NULL) return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
"运行时dynamic_cast的操作数必须具有多态类类型".
我想要实现这个的方式有什么问题?任何指导表示赞赏.