我最近使用了c#
,我希望继续使用c++
进行编程。
为什么?我喜欢游戏编程,我想学习DirectX
以获得更好的游戏图形
'^'
标志? (如Dispatchertimer^ a=ref new Dispatchertimer();
))new type()
和ref new type()
之间有什么区别?何时使用哪一个?auto
(如auto foo = ref new Foo();
)?::
”(如DispatcherTimer::Interval
)或“->
”(如a->interval
)或“.
”(如Timespan.duration
)?我能够使用'。'对于c#中的所有这些,但现在在c ++中它有点令人困惑!答案 0 :(得分:1)
编辑:这是指C ++,而不是C ++ - cli,帖子的标签现在提出的问题是关于。
C#在某些方面基于C ++,但该语言的一个关键特性是C ++程序员必须处理的许多复杂问题都是由运行时<但解决方案是通用的,因此通常较慢。它使C#更容易学习,更容易让程序员开始取得好成绩,而优秀的C ++程序员有能力编写更小,更高效,更强大的应用程序。
在C ++中,通过放置“&”来表示引用。在变量声明中的类型名称之后。
int i = 0;
int& j = i; // j is now an un-counted ref to i
这些不是C#的引用:它们没有被重新计数,也无法重新分配。一旦你在上面将“j”别名为“i”,你就无法改变它所引用的内容。
int i = 0;
int& j = i;
int k = 2;
j = k; // translates to i = 2
您还必须要注意,如果引用的对象消失,则会引发未定义的行为:
int* i = new int(3); // "i" is actually a pointer, the address of the new integer.
int& j = *i; // j references the integer to which i points.
j = 2; // OK: translates to (*i) = 2;
delete i; // return it to the pool
j = 3; // UNDEFINED BEHAVIOR: translates to (*i) = 3 but we just released i.
C ++中也没有“ref”关键字,因为没有内置的引用计数类型(但是,你可以使用std :: shared_ptr / std :: weak_ptr来实现类似的东西)。
“::”是范围运算符,用于表示“属于范围”而“。”和“ - >”表示“实例的成员”和“实例的成员”分别指向。
当您想要访问类的常量/静态成员或命名空间的成员时,或者当您需要消除不同命名空间中的类似名称时,您将使用“::”。
class Foo {
public:
void herp();
enum { Bad = 0, Good = 1 };
static int open(); // could class with C-standard library 'open' function.
};
// Implement the member "herp" of Foo
void Foo::herp()
{
}
由于foo的“open()”函数被声明为static,因此不是由成员调用,而是由Class调用。
// Using "::"
int quality = Foo::Good;
// Distinguish between 'open' in std vs foo
int fd = std::open("helloworld.txt");
int fd = Foo::open();
最后,你问了
What is difference between new type() and ref new type()
在C ++中,“new”表示“为指定内存并返回指针”。这些数据不会以任何方式重新计数或管理,您有责任确保释放内存,否则您将产生所谓的“内存泄漏”。考虑:
#include <iostream>
class Foo {
char m_data[1024 * 1024 * 1024]; // 1Gb of data
public:
Foo() {
std::cout << "New Foo at " << (void*)this << std::endl;
}
~Foo() {
std::cout << "Releasing Foo at " << (void*)this << std::endl;
}
void doWork() {
// imagine the foo is doing some work
}
};
void makeFooDoWork() {
static const size_t FOOS_AT_A_TIME = 16;
Foo* f = new Foo[FOOS_AT_A_TIME];
for (size_t i = 0; i < FOOS_AT_A_TIME; ++i) {
foo[i]->doWork();
}
/* In C#:
These objects would call Destroy() as they went out of
scope making them available for garbage collection.
In C++:
allocated objects are YOUR responsibility. Nothing
happens to them automatically.
*/
// free [] f; // <-- what we ought to do here.
}
int main(int argc, char* argv[]) {
std::cout << "Creating first foo" << endl;
Foo* f1 = new Foo;
std::cout << "Releasing it" << endl;
delete f1;
for (size_t i = 0; i < 10000000; ++i) {
makeFooDoWork();
}
}
在可预见的未来,这个程序可能会在大多数机器上崩溃,因为C ++没有垃圾收集,所以我们完全没有意识到我们没有跟踪我们分配的对象。
由于看起来问题实际上是关于C ++ / CLI,所以我要添加以下内容:
C ++ / CLI是由Microsoft开发的第二种C ++派生语言。在规定你提出有关C ++ / CLI的问题时需要小心,因为它与C ++不同,而不是很长时间。除了我不认识任何C ++ / CLI程序员之外,我不能说C ++ / CLI的流行。我认识Cobol程序员,C#开发人员,Objective-C人员,wazoo,C程序员甚至ada和业务基础程序员,我有一个朋友,他的顾问除了LISP什么都没做,我有几十个为微软工作的朋友,我有各种各样的经过微软认证的web / db / asp开发人员。
但是我认识的人实际上并没有使用C ++ / CLI - 我多年前曾用它来尝试开发一些.NET原型,但是在可选的时刻就把它丢弃了。 / p>
我建议您选择C ++或C#,因为您已经知道一些可能是您最佳路径的C#(例如,Unity 3D引擎允许您使用C#作为脚本语言); C#通过Mono可以实现跨平台开发,C ++ / CLI仅受微软支持。 C.F. VS2010中没有用于C ++ / CLI的Intellisense,尽管它在2012年出现。
答案 1 :(得分:0)
^
被称为“帽子”,它基本上是指托管指针
指向垃圾收集的对象。你会发现它
在.NET框架(C ++ / CLR)中,它不是C ++标准。ref new type()
是引用类时,使用 type
,这可以由垃圾收集器处理。有关它的更多信息,请访问:http://www.directxtutorial.com/lessonarticle.aspx?id=0
auto
关键字指定将从其初始化程序自动推导出正在声明的变量的类型。例如,auto a = 3
会使a
成为int
类型。
.
和->
都是访问运营商,a.b
表示访问对象a 的成员b,但a->b
表示访问成员的对象指向的b。 ::
是范围解析运算符。但所有这些都是你应该用Google搜索的基本内容。