c ++基本语法问题(从c#转到c ++)

时间:2013-09-29 19:20:18

标签: c# syntax c++-cli

我最近使用了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 ++中它有点令人困惑!

2 个答案:

答案 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搜索的基本内容。