非托管C++ (Unmanaged C++) Tips (Versus C#)

231 views 0 comments posted at about 8 years ago Raymond Tang

这几天正在学习C++(非托管,无特别说明以下的C++均指非托管的C++,而非CLR C++),为了快速的学习和加深印象,我对照VB、C#来学习,通过对比他们的相同与不同处达到融会贯通的目的,以下是一些总结或者注意点,希望对其他C++(尤其是之前学习C#)的新手提供一些参考。

我目前的学习资料是《Sams Teach Yourself C++ in One Hour a Day》英文版第六版,相关表述参照了其中的内容,并且以我自己的理解和语言进行描述,不准确的地方请见谅。

1,string即char数组,以'\0'即空字符结尾,如长度为16的字符串可以包含15个字符以及一个空字符;处理字符串有string类型,可以通过strcpy以及strncpy,strcat等函数操作字符串,与C语言类似;在通过std::cin读取字符串的时候尤其应注意空字符,可以通过设定读取长度等解决。

2,指针与C语言类似,在定义以后,应注意将其初始值设置为空指针即0,避免造成相关错误。

3,定义的数组变量即为指向数组第一个元素的指针,可以通过指针方便的操作数组,比如*(数组变量+1)即可获得一个元素的值;应注意区分数组变量指针以及指针类型的数组。

4,内存可以简单的有五个划分:Global namespace、the free store,Registers,Code space,the stack(后进先出);分别用于存储全局变量,局部变量以及方法参数,寄存器数据读取非常快,用于内部维护,比如记录stack的顶部以及命令指针等,code space 用于存储方法代码本身,其余的就是heap;指针可以用于方边操作free store即heap以及类的成员,还可以引用传值等;

5,通过new关键字可以分配heap空间,返回的是指针类型,该指针指向创建的对象;应注意当内存不足的情况,无法分配heap的时候,将返回空指针。

6,在C++中,定义一个变量,运行时即会在stack中为其分配相应的内存空间,无论是class类变量,还是builtin的变量;而在C#中,引用类型的变量如Object类,在实例化后直接在Heap上为其分配内存空间。

SimpleCat myCat; //C++中此处即会创建一个SimpleCat的变量,调用其默认构造函数

7,heap不会自动回收,为了避免内存泄露memory leak,应使用delete关键字回收该内存,一般在类中通过构造函数中初始,然后在析构函数中删除;执行delete后应该将指针设置为0,避免造成再次使用此指针造成程序崩溃等;在C#中,一般我们主要注意非托管资源的释放,而GC可以自动的回收不再使用的内存。

8,C++中的reference是引用,通过 &变量名=变量 的形式进行定义,&reference地址为实际指向变量的地址,reference变量不能够重新复制,只会将新的值赋值给之前的变量,并不会改变引用的地址这和C#中的引用类型不同,以及C++中的指针是可以重新赋值的;reference相当于是一个别名不能为空,而指针可以为空指针,通过这两种方式在函数之间船只类似于C#的ref和out关键字所起作用;在引用传值的时候应尽量使用reference的方式,它更易于理解。

9,虽然可以方便的通过指针进行传值,由于指针暴露了变量在内存中的真实地址,所以是很危险的操作,为了避免被更改,可以使用指向常量的指针,以及指向常量的常量指针来避免在其他函数中被更改的危险;同时应注意区分指向常量的指针以及常量指针,常量指针不能再为指针赋值。

10,C++的很多运算符和C#等比较的类似,不过应注意*以及&等操作运算符的多重含义;循环控制语句等也和C#类似。

11,C++中应注意养成良好的代码书写习惯,同时应注意方法定义declare与方法实现definition的区别,这点习惯了C#的程序员可能最初的时候不会太适应,而且还会遇到 方法吗 not define or found in the scope等编译时的错误。

在我不断的学习过程中,我会不断的更新这篇文章,最后再附上一个Win32的Hello World的 C++版本例子(IDE使用的VS2010)。

#include "iostream"

//methods declaration
void helloWorld();
char pause();

int main()
{
    helloWorld();
    pause();
    return 0;
}

//methods definition
void helloWorld()
{
     using namespace std;
     cout<<"Hello World!"<<endl;
}
char pause()
{
    using namespace std;
    cout <<endl << "Please input any charactor to exit." << endl;
    char c;
    cin >>c;
    return c;
}


Add comment

Comments (0)

No comments yet.
In this Page